명시적 인터페이스 구현(C# 프로그래밍 가이드)
클래스에서 시그니처가 동일한 멤버가 들어 있는 두 인터페이스를 구현하는 경우 클래스에서 이 멤버를 구현하면 두 인터페이스 모두에서 이 멤버를 해당 구현으로 사용하게 됩니다. 예를 들면 다음과 같습니다.
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
// Both ISurface.Paint and IControl.Paint call this method.
public void Paint()
{
}
}
그러나 두 인터페이스 멤버가 동일한 기능을 수행하지 않는 경우에는 인터페이스 하나 또는 모두의 구현이 잘못될 수 있습니다. 인터페이스를 통해서만 호출되고 특정 인터페이스에만 관련되는 클래스 멤버를 만드는 방식으로 인터페이스 멤버를 명시적으로 구현할 수 있습니다. 이렇게 하려면 인터페이스 이름과 마침표를 사용하여 클래스 멤버의 이름을 지정해야 합니다. 예를 들면 다음과 같습니다.
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
클래스 멤버 IControl.Paint는 IControl 인터페이스를 통해서만 사용할 수 있고 ISurface.Paint는 ISurface를 통해서만 사용할 수 있습니다. 두 메서드 구현은 서로 별개이며 어느 쪽도 클래스에 대해 직접 사용할 수 없습니다. 예를 들면 다음과 같습니다.
SampleClass obj = new SampleClass();
//obj.Paint(); // Compiler error.
IControl c = (IControl)obj;
c.Paint(); // Calls IControl.Paint on SampleClass.
ISurface s = (ISurface)obj;
s.Paint(); // Calls ISurface.Paint on SampleClass.
두 인터페이스에서 각각 이름이 동일하지만 서로 다른 속성 및 메서드 등의 멤버를 선언할 때 발생하는 문제의 해결에도 명시적 구현이 사용됩니다.
interface ILeft
{
int P { get;}
}
interface IRight
{
int P();
}
두 인터페이스를 모두 구현하려는 경우에는 클래스에서 P 속성이나 P 메서드 또는 둘 모두에 대해 명시적 구현을 사용해야 컴파일러 오류를 방지할 수 있습니다. 예를 들면 다음과 같습니다.
class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}