부모 클래스에서 선언 된 가상함수를 자식 클래스에서 재정의(override)할 수 있도록 한다.
이때 반드시 기본 구현이 있어야 한다.
자식 클래스는 필요에 따라 해당 클래스를 재정의(override)할 수 있다.
class Parent
{
public virtual void ShowMessage() {
Console.WriteLine("Parent 클래스의 ShowMessage");
}
}
class Child : Parent
{
public override void ShowMessage() { // 부모 메서드 재정의
Console.WriteLine("Child 클래스의 ShowMessage");
}
}
class Program
{
static void Main() {
Parent obj1 = new Parent();
obj1.ShowMessage(); // "Parent 클래스의 ShowMessage"
Parent obj2 = new Child();
obj2.ShowMessage(); // "Child 클래스의 ShowMessage"
}
}
다형성를 활용하여 부모 타입을 통해 자식 클래스의 기능을 호출 할 수 있으며 기존 코드를 수정하지 않고 기능 확장이 가능하다. 즉 같은 부모 클래스로 묶으면서 자식들의 고유의 기능을 쓸 때 사용한다.
부모 클래스에서 virtual 또는 abstract 메서드를 재정의(Override)하는 키워드이다.
부모 클래스의 동작을 유지하면서도, 자식 클래스에서 새로운 동작을 적용할 수 있다.
class Parent
{
public virtual void Print() {
Console.WriteLine("부모 클래스 Print()");
}
}
class Child : Parent
{
public override void Print() { // 부모 메서드 재정의
Console.WriteLine("자식 클래스 Print()");
}
}
기본의 부모 코드(virtual, abstract)를 변경하지 않고 새로운 기능을 추가할 수 있다.
상속을 전제한 코드 또는 base.Print()를 통해 부모에서 구현한 코드 역시 호출할 때 사용할 수 있다.
abstract 를 통해 선언 되며 선언만 되고 구현되지 않은 함수와 클래스이다.
추상 메서드를 쓰기 위해서는 클래스는 추상 클래스여야만 한다.
또한 추상 메서드는 반드시 자식에서 구현되어야 한다.
abstract class Animal
{
public abstract void MakeSound(); // 추상 메서드 (구현 X)
}
class Dog : Animal
{
public override void MakeSound() { // 반드시 구현해야 함
Console.WriteLine("멍멍!");
}
}
class Program
{
static void Main() {
Animal myDog = new Dog();
myDog.MakeSound(); // "멍멍!"
}
}
다형성을 사용할 경우 강제적인 구조를 제공하여, 상속받은 클래스가 반드시 특정 기능을 구현하도록 유도할 때 사용한다.
즉 다형성을 이용한 상속 관계를 구현하고자 한다면 부모에는 virtual, abstract을 가지고 있어야한다.
그러면서 자식은 override를 통해 자신의 함수를 구현하는데
이때 virtual은 부모만 존재 할 수 있으며 자식은 구현하지 않을 수 있다.
abstract는 부모는 선언만 하고 구현은 할 수 없고 클래스로 abstract로 선언하야한다.
그리고 자식에서 무조건 함수 구현을 해야한다.