using System;
namespace thisIsCSharp
{
class Beverage // 부모 - 마실 것
{
public virtual void Drinking() //virtual 오버라이딩 할 메소드 하나
{
Console.WriteLine("뭔가 마시고 싶은데...");
}
}
class Coffee : Beverage
{
public override void Drinking() // override 오버라이딩 받아올 거야
{
base.Drinking();
Console.WriteLine("커피를 마시자!");
}
}
class Lemonade : Beverage
{
public override void Drinking()
{
base.Drinking();
Console.WriteLine("레모네이드를 마시자!");
}
}
class MainApp
{
static void Main(string[] args)
{
Console.WriteLine("목이 마르네...");
Beverage beverage = new Beverage();
beverage.Drinking();
Console.WriteLine();
Console.WriteLine("카페인이 부족해...");
Beverage coffee = new Coffee();
// Coffee coffee = new Coffee();
coffee.Drinking();
Console.WriteLine();
Console.WriteLine("상큼한 게 먹고 싶어...");
Beverage lemonade = new Lemonade();
// Lemonade lemonade = new Lemonade();
lemonade.Drinking();
}
}
}
마실 것이라는 클래스를 커피와 레모네이드가 각각 상속받고 마실 것에 있는 메소드 Drinking에 virtual 을 붙여 Drinking을 재정의하는 걸 허락해주는 것이다.
virtual이 붙어있는 메소드만 재정의 할 수 있다.
virtual은 허락을 고지하는 개념이다.
이걸 override로 재정의(오버라이딩) 하는 것이다.
재정의하기 위해서 기존 값에 접근해야 하기 때문에 private는 오버라이딩 할 수 없다.
protected로 바꾸니 override도 protected로 바꾸라고 떴고(프로젝티드를 퍼블릭으로 가져올 수는 없는 것 같았다.), 다 바꾸고 나서는 메인 메소드에서 보안수준 때문에 접근이 안 돼서 실패했다. 다른 클래스로 쓸 경우에는 퍼블릭으로 써야할 것 같다.
코드 하단에 주석 표시한 것처럼 각각 선언하게 되면 각각의 객체로 선언된다. 지금 코드에서는 두 값이 동일하기 때문에 별 상관없는데 굳이
Beverage ___ = new Lemonade();
이런 식으로 쓴 것은 추후 상속받는 자식 클래스들을 배열로 일괄 생성할 수 있기 때문이다. 이럴 때 같이 Beverage로 묶여 있다면 되는데 각자 Coffee 나 Lemonade로 만들면 배열로 묶는 게 안 된다.