显式接口实现
当你实现定义公共方法的多个接口时,显式接口实现是必需的,但根据使用哪个接口来调用方法,需要不同的实现(请注意,如果多个接口共享相同的方法,则不需要显式实现一个共同的实现是可能的)。
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
应尽可能做同样的事情。