클래스는 다른 클래스로부터 유산을 물려받을 수 있다
부모클래스 -> 자식클래스
(= 기반클래스 -> 파생클래스)
class 기반클래스
{
//멤버
}
class 파생클래스 : 기반클래스
{
//아무 멤버를 선언하지 않아도 기반클래스의 모든것을 물려받아 가지게 됨
//단, pivate으로 선언한 멤버는 예외
}
파생클래스는 객체를 생성할 때 내부적으로
기반클래스의 생성자 호출 → 자신의 생성자 호출
객체가 소멸할 때는 반대의 순서로
(파생클래스 → 기반클래스)로 종료자를 호출
그렇다면 만약 기반클래스의 생성자가 매개변수를 입력받도록 선언되어 있다면
파생클래스의 인스턴스를 생성할 때 호출되는 기반 클래스의 생성자에는
어떻게 매개변수를 전달해 줄 수 있을까?
====> base키워드 사용!
this가 자기자신을 가리킨다면 base는 "기반 클래스"를 가리킨다
this를 통해 자기 자신의 멤버에 접근할 수 있던 것처럼 base를 통해 기반클래스의 멤버에 접근 가능
class Base
{
public void BaseMethod(){//기능};
}
class Dervied : Base
{
public void DerviedMethod()
{
base.BaseMethod(); // Base클래스에 속한 메서드에 접근 가능
}
}
이런식으로 가능하다.
그렇다면 질문의 내용처럼 파생클래스의 생성자에서 기반클래스의 생성자로 매개변수를 넘기려면
class Base
{
protected string Name;
pulbic Base(string Name) //기반클래스의 생성자에 있는 매개변수 string Name
{
this.Name = Name;
}
}
class Dervied : Base
{
public Dervied(string Name) : base(Name)
//!!base(Name)을 사용해서 Base(string Name)호출!!
//조금 이해안가는데 여기선 이름이 Name으로 같아서 그대로 Base의 Name으로 들어가는듯
//? .. 내가 말하고도 이해안감
{
Console.WriteLine("{0}.Dervied()", this.Name);
}
총 정리해서 예제코드 작성
using System;
using static System.Console;
namespace thistiscsharp
{
class Base
{
protected string Name;
public Base(string Name)
{
this.Name = Name;
Console.WriteLine($"{this.Name} , Base()");
}
public void BaseMethod()
{
Console.WriteLine($"{this.Name}, BaseMethod()");
}
~Base(){
Console.WriteLine($"{this.Name}, ~Base()");
}
}
class Derived : Base
{
public Derived(string Name) : base(Name)
//기반생성자가 매개변수를 입력받도록 선언되었다.
//파생클래스의 인스턴스를 생성할 때 기반클래스의 생성자->파생클래스의 생성자 순으로 호출이 되는데
//파생클래스의 인스턴스를 생성할 때 기반클래스의 생성자에게 매개변수를 전달하기 위해서 base키워드사용
{
Console.WriteLine($"{this.Name} , Derived()");
//여기 this.Name이 좀의아한데 내추측으론
//부모의 필드에있는 protected stirng Name을 가리키는 것 같다
//근거는 파생인스턴스 생성할때 먼저 기반의 생성자를 호출하고
//아니면 base키워드썼으니까?
//지웅이도 그런것 같다한다 잘모르겠다
}
public void DerivedMethod()
{
Console.WriteLine($"{this.Name}, DerivedMethod()");
}
~Derived()
{
Console.WriteLine($"{this.Name}, ~Derived");
}
}
class MainClass
{
public static void Main(string[] args)
{
Base a = new Base("a");
a.BaseMethod();
Derived b = new Derived("b");
b.BaseMethod();
b.DerivedMethod();
}
}
}
출력
a.Base() //기반 생성자
a.BaseMethod() //기반 메소드
b.Base() //기반생성자
b.Dervied()//파생생성자
b.BaseMethod()
b.DerviedMethod()
b.~Dervied()
b.~Base()
a.~Base()
상속을 못하게 하는방법 = sealed 한정자 이용
- 의도하지 않는 상속이나 파생클래스의 구현을 막기 위해
- 상속 봉인이 되어 이로부터 상속받으려는 시도가 있으면 컴파일 에러
sealed class Base
{
}
포함기법
다중상속은 불가.
그래도 여러 클래스로부터 구현을 물려받고 싶다면 단순히 클래스 안에 물려받고 싶은 기능을 가진 클래스들을 필드로 선언해 넣으면 된다.
MyVehicle()
{
Car car = new Car();
Plane plane = new Plane();
pulbic void Fly() {plane.Ride();}
public void Run() {car.Ride();}
}
클래스는 다른 클래스로부터 유산을 물려받을 수 있다
부모클래스 -> 자식클래스
(= 기반클래스 -> 파생클래스)
class 기반클래스
{
//멤버
}
class 파생클래스 : 기반클래스
{
//아무 멤버를 선언하지 않아도 기반클래스의 모든것을 물려받아 가지게 됨
//단, pivate으로 선언한 멤버는 예외
}
파생클래스는 객체를 생성할 때 내부적으로
기반클래스의 생성자 호출 → 자신의 생성자 호출
객체가 소멸할 때는 반대의 순서로
(파생클래스 → 기반클래스)로 종료자를 호출
그렇다면 만약 기반클래스의 생성자가 매개변수를 입력받도록 선언되어 있다면
파생클래스의 인스턴스를 생성할 때 호출되는 기반 클래스의 생성자에는
어떻게 매개변수를 전달해 줄 수 있을까?
====> base키워드 사용!
this가 자기자신을 가리킨다면 base는 "기반 클래스"를 가리킨다
this를 통해 자기 자신의 멤버에 접근할 수 있던 것처럼 base를 통해 기반클래스의 멤버에 접근 가능
class Base
{
public void BaseMethod(){//기능};
}
class Dervied : Base
{
public void DerviedMethod()
{
base.BaseMethod(); // Base클래스에 속한 메서드에 접근 가능
}
}
이런식으로 가능하다.
그렇다면 질문의 내용처럼 파생클래스의 생성자에서 기반클래스의 생성자로 매개변수를 넘기려면
class Base
{
protected string Name;
pulbic Base(string Name) //기반클래스의 생성자에 있는 매개변수 string Name
{
this.Name = Name;
}
}
class Dervied : Base
{
public Dervied(string Name) : base(Name)
//!!base(Name)을 사용해서 Base(string Name)호출!!
//조금 이해안가는데 여기선 이름이 Name으로 같아서 그대로 Base의 Name으로 들어가는듯
//? .. 내가 말하고도 이해안감
{
Console.WriteLine("{0}.Dervied()", this.Name);
}
총 정리해서 예제코드 작성
using System;
using static System.Console;
namespace thistiscsharp
{
class Base
{
protected string Name;
public Base(string Name)
{
this.Name = Name;
Console.WriteLine($"{this.Name} , Base()");
}
public void BaseMethod()
{
Console.WriteLine($"{this.Name}, BaseMethod()");
}
~Base(){
Console.WriteLine($"{this.Name}, ~Base()");
}
}
class Derived : Base
{
public Derived(string Name) : base(Name)
//기반생성자가 매개변수를 입력받도록 선언되었다.
//파생클래스의 인스턴스를 생성할 때 기반클래스의 생성자->파생클래스의 생성자 순으로 호출이 되는데
//파생클래스의 인스턴스를 생성할 때 기반클래스의 생성자에게 매개변수를 전달하기 위해서 base키워드사용
{
Console.WriteLine($"{this.Name} , Derived()");
//여기 this.Name이 좀의아한데 내추측으론
//부모의 필드에있는 protected stirng Name을 가리키는 것 같다
//근거는 파생인스턴스 생성할때 먼저 기반의 생성자를 호출하고
//아니면 base키워드썼으니까?
//지웅이도 그런것 같다한다 잘모르겠다
}
public void DerivedMethod()
{
Console.WriteLine($"{this.Name}, DerivedMethod()");
}
~Derived()
{
Console.WriteLine($"{this.Name}, ~Derived");
}
}
class MainClass
{
public static void Main(string[] args)
{
Base a = new Base("a");
a.BaseMethod();
Derived b = new Derived("b");
b.BaseMethod();
b.DerivedMethod();
}
}
}
출력
a.Base() //기반 생성자
a.BaseMethod() //기반 메소드
b.Base() //기반생성자
b.Dervied()//파생생성자
b.BaseMethod()
b.DerviedMethod()
b.~Dervied()
b.~Base()
a.~Base()
상속을 못하게 하는방법 = sealed 한정자 이용
- 의도하지 않는 상속이나 파생클래스의 구현을 막기 위해
- 상속 봉인이 되어 이로부터 상속받으려는 시도가 있으면 컴파일 에러
sealed class Base
{
}
포함기법
다중상속은 불가.
그래도 여러 클래스로부터 구현을 물려받고 싶다면 단순히 클래스 안에 물려받고 싶은 기능을 가진 클래스들을 필드로 선언해 넣으면 된다.
MyVehicle()
{
Car car = new Car();
Plane plane = new Plane();
pulbic void Fly() {plane.Ride();}
public void Run() {car.Ride();}
}