[C#] 8.1.3 명시적 인터페이스 구현

같은 이름의 멤버가 캡슐화되어 있는 서로 다른 인터페이스를 기반으로 형식을 정의할 때는 묵시적 인터페이스 구현을 하면 이름 충돌이 납니다. 이럴 때는 명시적 인터페이스 구현으로 이름 충돌을 피해야 합니다.

▶ 명시적 인터페이스 구현으로 이름 충돌

interface IStudy
{
    void Study();
    void Work(); //ITeach 인터페이스에도 같은 이름의 멤버가 있음
}
interface ITeach
{
    void Teach();
    void Work(); //IStudy 인터페이스에도 같은 이름의 멤버가 있음
}
class PartTimeTeacher : IStudy, ITeach
{
    void IStudy.Study()
    {
        Console.WriteLine("공부하다.");
    }
    void IStudy.Work() //이름 충돌을 막기 위해 명시적 인터페이스 구현
    {
        Console.WriteLine("강의를 듣다.");
    }
    void ITeach.Teach()
    {
        Console.WriteLine("강의하다.");
    }
    void ITeach.Work() //이름 충돌을 막기 위해 명시적 인터페이스 구현
    {
        Console.WriteLine("연구하다.");
    }
}

이처럼 명시적으로 인터페이스 구현하면 사용하는 곳에서는 인터페이스 형식 변수로 개체를 참조해야 약속한 멤버를 사용할 수 있습니다.

▶ 인터페이스 형식 변수로 개체 참조

class Program
{
    static void Main(string[] args)
    {
        PartTimeTeacher pt_teacher = new PartTimeTeacher();
        IStudy istudy = pt_teacher as IStudy; //IStudy 인터페이스 참조
        if (istudy != null)
        {
            istudy.Study();
        }
    }
}

[그림 43]은 명시적 인터페이스 구현한 개체 멤버를 직접 접근할 때 오류 화면입니다.

명시적 인터페이스 구현한 개체 멤버를 직접 접근할 때 오류 화면
[그림 43] 명시적 인터페이스 구현한 개체 멤버를 직접 접근할 때 오류 화면