[카테고리:] <span>Escort C#</span>

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

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

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] 명시적 인터페이스 구현한 개체 멤버를 직접 접근할 때 오류 화면

Escort C#