클래스 앞에 abstract를 붙이면 사용가능하다.
abstract class Monster : Character
{
// 가상함수
public virtual void Attack()
{
//원본이 존재, 구현하지 않아도 원본이 있음.
}
// 추상함수
public abstract void DropExp();
}
abstract로 정의된 함수는 자식클래스에서 반드시 정의를 해주어야한다.
class Slime : Monster
{
public override void Attack()
{
}
public override void DropExp() {
}
}
override해서 자식클래스에서 함수를 만들 수 있다.
Slime slime = new Slime();
Goblin goblin = new Goblin();
Orc orc = new Orc();
Monster[] monster = new Monster[3];
monster[0] = slime;
monster[1] = goblin;
monster[2] = orc;
Monster클래스로 선언된 monster에 자식클래스로 선언된 slime과 goblin, orc를 업캐스팅해서 넣어주었음.
Character ch = new Player();
Player p = (Player)ch;
ch가 자식클래스인 Player클래스로 만들어져있다.
//1번 방법
if(ch is Monster m)
{
Console.WriteLine("다운캐스팅 성공!");
}
else
{
Console.WriteLine("다운캐스팅 실패!");
}
ch가 지금 player로 만들어졌기 때문에 monster가 아니라서 다운캐스팅이 실패한다.
Monster m1 = ch as Monster;
ch가 monster라면 m1에 대입. 아니라면 null이 들어감.