타입에 상관 없이 인스턴스에 따른 동작을 실행시키고 싶을 때 다형성을 활용한다.
1. 오버라이드 되지 않은 메서드
class Program
{
static void Main(string[] args)
{
Animal a1 = new Animal();
a1.Cry();
Dog d = new Dog();
d.Cry();
Cat c = new Cat();
c.Cry();
Animal a2 = new Dog();
a2.Cry();
}
}
class Animal
{
public void Cry()
{
Console.WriteLine("Cry.");
}
}
class Dog : Animal
{
public void Cry()
{
Console.WriteLine("Bow-wow");
}
}
class Cat : Animal
{
public void Cry()
{
Console.WriteLine("Mew-mew");
}
}
컴파일 경고가 발생한다. 자식 클래스에서 override 키워드를 추가하거나 new 키워드를 추가할 것을 추천한다.
Cry.
Bow-wow
Mew-mew
Cry.
부모 타입으로 자식 인스턴스를 생성 시, 부모의 Cry()가 호출되었다.
2. override로 다형성 적용하기
class Animal
{
virtual public void Cry()
{
Console.WriteLine("Cry.");
}
}
class Dog : Animal
{
override public void Cry()
{
Console.WriteLine("Bow-wow");
}
}
class Cat : Animal
{
override public void Cry()
{
Console.WriteLine("Mew-mew");
}
}
Cry.
Bow-wow
Mew-mew
Bow-wow
부모 타입으로 자식 인스턴스 생성 시, 자식의 Cry()가 호출되었다.
3. new로 override하지 않을 것을 명시하기
class Dog : Animal
{
new public void Cry()
{
Console.WriteLine("Bow-wow");
}
}
Cry.
Bow-wow
Mew-mew
Cry.