C#

C#) interface 인터페이스

그린티라떼 2022. 1. 13. 22:20
    abstract class Monster
    {
        public abstract void Shout();
    }

    class Orc : Monster
    {
        public override void Shout()
        {
            Console.WriteLine("orc orc!");
        }
    }
    class Skeleton : Monster
    {
        public override void Shout()
        {
            Console.WriteLine("kele kele!");
        }
    }

추상 클래스 Monster안에 추상 메서드 Shout()를 만들고

추상 클래스 Monster를 상속 받는 Orc 와 Skeleton이 있다. 

 

class SkeletonOrc : Orc, Skeleton
{
}

끔찍한 혼종 SkeletonOrc를 만들려고 한다. 그러려면 Orc와 Skeleton을 같이 상속받아야 하는데 C#에서는 다중 상속을 지원하지 않아 오류가 생긴다. (C++에서는 지원하고 있다.)

다중 상속의 문제점 : SkeletonOrc와 같은 경우 Shout() override시 Orc의 Shout()를 사용할 것 인지, Skeleton의 Shout()를 사용할 

                               것인지 문제가 생긴다. ( 죽음의 다이아몬드)

 

위 문제점을 해결하기 위해서  interface를 사용해야 한다.

interface IFlyable
{
    void Fly();
}
class FlyableOrc : Orc, IFlyable
{
    public void Fly()
    {
        Console.WriteLine("I can fly!");
    }
}


FlyableOrc orc = new FlyableOrc();
orc.Fly();
orc.Shout();

FlyableOrc객체인 orc는 Fly()와 Shout()를 사용할 수 있다.

 

void DoFly(IFlyable flyable)
{
    flyable.Fly();
}

FlyableOrc orc = new FlyableOrc();
DoFly(orc);

IFlyable가 있는 객체만 DoFly()를 사용할 수 있게 할 수도 있다.