동일한 메서드를 상황에 따라 다른 방식으로 사용하고 싶을 때
-> 부모 클래스에서는 정의만 하고 상속받는 자식 클래스에서는 재정의하여 원하는 대로 사용한다
// 추상메서드는 반드시 추상 클래스 안에 위치해야 한다.
abstract class Figure
{
// 넓이를 구하는 함수를 만들고 싶은데 원이나 삼각형, 사각형에 따라 공식이 다름
// -> 일단 정의만 하고 상황에 맞게 재정의하면서 사용하자!!
abstract public Double Area();
}
// --------------------------------------------------------------------
// Figure 클래스를 상속받아서 내부의 Area 메서드를 활용
class Rectangle : Figure
{
public double Width{ get; set; }
public double Height { get; set; }
public Rectangle(double width, double height)
{
this.Width = width;
this.Height = height;
}
// Figure 클래스를 상속받는다면 해당 클래스의 추상 메서드인 Area 를 반드시 구현해야된다.
public override double Area()
{
return Width * Height;
}
}
//----------------------------------------------------------------
class Circle : Figure
{
public double Diameter{ get; set; }
public Circle(double diameter)
{
this.Diameter = diameter;
}
public override double Area()
{
return ((Diameter / 2) * (Diameter / 2)) * 3.141592;
}
}
출력
사각형의 면적은 200
원의 면적은 78.5398
같은 Area 메서드를 상황에 맞게(원,사각형) 재정의해서 사용한다
유의점
추상 메서드가 포함된 클래스는 반드시 추상 클래스여야 한다.(Figure 클래스)
추상 클래스를 상속받은 경우 반드시 해당 클래스 내부의 추상 메서드를 구현하여야 한다.
(Circle, Rectangle 클래스)
interface IClassType
{
void Attack1();
void TestAttack();
}
class Parent1
{
public void Attack() { }
}
class Child : Parent1, IClassType
{
public void TestAttack()
{
Console.WriteLine("TestAttack");
}
public void Attack1()
{
Console.WriteLine("Attack1");
}
// 인터페이스에서 정의한 TestAttack, Attack1 재정의
}
클래스는 다중 상속이 불가능하지만 인터페이스의 경우 다중 상속 가능
선언 부분만 작성해놓고 상속받는 클래스에서 재정의해서 사용
※ 상속받는 클래스에서 인터페이스의 메서드를 반드시 재정의해야됨
public int m_Def = 0;
public int Def
{
get
{
return m_Def;
}
set
{
m_Def = value
}
}
public int HP{get; set;} //이렇게도 사용 가능
static void Main(string[] args)
{
Parent2 p2 = new Parent2();
p2.Def = 10;
int val = p2.Def;
Console.WriteLine(val);
Console.ReadKey();
}
p2.Def = 10; => m_Def 를 set 하는 함수처럼 사용
int val = p2.Def; => m_Def 를 get 하는 변수처럼 사용