顯式介面實現
當你實現定義公共方法的多個介面時,顯式介面實現是必需的,但根據使用哪個介面來呼叫方法,需要不同的實現(請注意,如果多個介面共享相同的方法,則不需要顯式實現一個共同的實現是可能的)。
interface IChauffeur
{
string Drive();
}
interface IGolfPlayer
{
string Drive();
}
class GolfingChauffeur : IChauffeur, IGolfPlayer
{
public string Drive()
{
return "Vroom!";
}
string IGolfPlayer.Drive()
{
return "Took a swing...";
}
}
GolfingChauffeur obj = new GolfingChauffeur();
IChauffeur chauffeur = obj;
IGolfPlayer golfer = obj;
Console.WriteLine(obj.Drive()); // Vroom!
Console.WriteLine(chauffeur.Drive()); // Vroom!
Console.WriteLine(golfer.Drive()); // Took a swing...
除了使用介面之外,無法從其他任何地方呼叫實現:
public class Golfer : IGolfPlayer
{
string IGolfPlayer.Drive()
{
return "Swinging hard...";
}
public void Swing()
{
Drive(); // Compiler error: No such method
}
}
因此,將顯式實現的介面的複雜實現程式碼放在單獨的私有方法中可能是有利的。
顯式介面實現當然只能用於該介面實際存在的方法:
public class ProGolfer : IGolfPlayer
{
string IGolfPlayer.Swear() // Error
{
return "The ball is in the pit";
}
}
類似地,使用顯式介面實現而不宣告類上的介面也會導致錯誤。
暗示:
顯式實現介面也可用於避免死程式碼。當不再需要某個方法並從介面中刪除時,編譯器會抱怨每個仍然存在的實現。
注意:
無論型別的上下文如何,程式設計師都希望合約是相同的,並且顯式實現在呼叫時不應暴露不同的行為。因此,與上面的示例不同,IGolfPlayer.Drive
和 Drive
應儘可能做同樣的事情。