같은 이름의 멤버가 캡슐화되어 있는 서로 다른 인터페이스를 기반으로 형식을 정의할 때는 묵시적 인터페이스 구현을 하면 이름 충돌이 납니다. 이럴 때는 명시적 인터페이스 구현으로 이름 충돌을 피해야 합니다.
▶ 명시적 인터페이스 구현으로 이름 충돌
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]은 명시적 인터페이스 구현한 개체 멤버를 직접 접근할 때 오류 화면입니다.