C#은 클래스의 필드, 메소드, 프로퍼티 같은 멤버들을 물려받아(?) 똑같은 코드를 굳이 안써도 되는 기능을 제공합니다.
물려받는 클래스(자식 클래스 또는 파생 클래스)가 물려줄 클래스(부모 클래스 또는 기반 클래스)를 지정합니다.
상속
class 부모_클래스
{
// 멤버 선언
}
class 자식_클래스 : 부모_클래스
{
// 부모 클래스의 모든 것을 물려받아 갖게 된다.
// 단, private로 선언된 멤버는 제외.
}
자식 클래스의 이름 뒤에 클론( : )을 붙여주고 그 뒤에 부모 클래스의 이름을 붙여주면 됩니다.
부모 클래스의 생성자() 자식 클래스의 생성자() 자식 클래스의 종료자() 부모 클래스의 종료자() |
클래스 호출이 이루어지는 순서는 부모 클래스의 생성자 -> 자식 클래스의 생성자 -> 자식 클래스의 종료자 -> 부모 클래스의 종료자
입니다.
base 키워드
base 키워드는 부모 클래스를 가리킵니다. base 키워드를 통해 부모 클래스의 멤버에 접근할 수 있습니다.
class Base
{
public void BaseMethod()
{
}
}
class Derived : Base
{
public void DerivedMethod()
{
base.BaseMethod();
}
}
base() 생성자
부모 클래스의 생성자가 매개 변수를 입력받도록 선언되어 있다면 자식 클래스의 인스턴스를 생성할 때 호출되는 부모 클래스의 생성자에게 매개 변수를 전달하려면 base() 생정자
를 사용하면 됩니다.
class Base
{
protected string Name;
public Base(string Name)
{
this.Name = Name;
}
}
class Derived : Base
{
public Derived(string Name) : base(Name)
{
Console.WriteLine($"{this.Name}.Derived()");
}
}
this()가 자기 자신의 생성자인 것처럼, Base()는 부모 클래스의 생성자입니다. 위 코드의 base(Name)은 Base(string Name)을 호출합니다.
예제
class Base
{
protected string Name;
public Base(string Name)
{
this.Name = Name;
Console.WriteLine($"{this.Name}.Base()");
}
~Base()
{
Console.WriteLine($"{this.Name}.~Base()");
}
public void BaseMethod()
{
Console.WriteLine($"{Name}.BaseMethod()");
}
}
class Derived : Base
{
public Derived(string Name) : base(Name)
{
Console.WriteLine($"{this.Name}.Derived()");
}
~Derived()
{
Console.WriteLine($"{this.Name}.~Derived()");
}
public void DerivedMethod()
{
Console.WriteLine($"{Name}.DerivedMethod()");
}
}
class MainApp
{
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.Derived() b.BaseMethod() b.DerivedMethod() |
상속 봉인 한정자
sealed 한정자를 이용하면 해당 클래스는 상속 봉인(봉인 클래스)되어 상속받으려는 시도가 있으면 컴파일러 에러가 발생합니다.
sealed class Base
{
}
class Derived : Base // 컴파일 에러
{
}