객체지향의 특징인 다형성(Polymorphism)
같은 이름을 갖는 메소드를 오버라이딩하여 새롭게 구현할 수 있다.
1. virtual-override
class Cat
{
public virtual void Init()
{
Console.WriteLine("고양이다냥!");
}
}
class CatBlack : Cat
{
public override void Init()
{
base.Init();
Console.WriteLine("턱시도를 입었다냥");
}
}
class CatCheese : Cat
{
public override void Init()
{
base.Init();
Console.WriteLine("치즈냥이지롱!");
}
}
오버라이딩할 메소드는 virtual 로 선언.
상속받은 클래스에서는 override 키워드를 활용해서 메소드를 오버라이딩할 수 있다.
기반 클래스의 메소드를 실행하려면 base.메소드명()을 쓰자.
테스트
class MainApp
{
static void Main()
{
Cat cat = new Cat();
cat.Init();
Console.WriteLine();
CatBlack catBlack = new CatBlack();
catBlack.Init();
Console.WriteLine();
CatCheese catCheese = new CatCheese();
catCheese.Init();
}
}
결과
고양이다냥!
고양이다냥!
턱시도를 입었다냥
고양이다냥!
치즈냥이지롱!
2. 메소드 숨기기
메소드를 오버라이딩 하려면 virtual로 선언되어있어야 한다.
그런데, 애초에 설계 단계에서부터 이 메소드가 오버라이딩이 될지 안될지를 알기는 어렵다.
나중에 기존의 Base 클래스의 메소드를 수정하지 않고 오버라이딩을 하고 싶다면, new 한정자를 사용하면 된다.
class Cat
{
public void Init()
{
Console.WriteLine("고양이다냥!");
}
}
class CatBlack : Cat
{
public new void Init()
{
base.Init();
Console.WriteLine("턱시도를 입었다냥");
}
}
class CatCheese : Cat
{
public new void Init()
{
base.Init();
Console.WriteLine("치즈냥이지롱!");
}
}
결과는 virtual-override 를 사용했을 때와 같다.
3. 오버라이딩 봉인하기
virtual로 선언된 가상 메소드를 봉인할 수 있다.
Cat을 상속받은 CatBlack 클래스에서는 Init 메소드를 오버라이딩하여 사용할 수 있다.
나중에 CatBlack을 상속받은 클래스가 Init 메소드를 잘 못 오버라이딩하여 오작동할 위험이 있다면 미리 봉인해놓는 게 좋다.
class Cat
{
public virtual void Init()
{
Console.WriteLine("고양이다냥!");
}
}
class CatBlack : Cat
{
public sealed override void Init()
{
base.Init();
Console.WriteLine("턱시도를 입었다냥");
}
}
class CatBlackAndWhite : CatBlack
{
// 컴파일 에러!! because it is sealed.
public override void Init()
{
base.Init();
Console.WriteLine("나는 누구인가!");
}
}
참조
뇌를 자극하는 C# 5.0 프로그래밍, 박상현, 한빛미디어
'아카이빙 > C#' 카테고리의 다른 글
[C#] 구조체 (0) | 2018.06.18 |
---|---|
[C#] 확장 메소드 (Extension Method) (0) | 2018.06.18 |
[C#] 형변환과 is, as (0) | 2018.06.18 |
[C#] this() 생성자 (0) | 2018.06.18 |
[C#] 얕은 복사와 깊은 복사 (0) | 2018.06.18 |