一个人如何选择是实现接口还是显式实现接口?

4

实现接口有两种方式:

interface IMyInterface
{
    void Foo();
}

class IImplementAnInterface : IMyInterface
{
    public void Foo()
    {
    }
}
// var foo = new IImplementAnInterface();
// foo.Foo(); //Ok
// ((IMyInterface)foo).Foo(); //Ok

class IExplicitlyImplementAnInterface : IMyInterface
{
    void IMyInterface.Foo()
    {
    }
}
// var foo = new IExplicitlyImplementAnInterface();
// foo.Foo(); //ERROR!
// ((IMyInterface)foo).Foo(); //Ok

区别在于,如果接口被显式实现,那么在允许调用Foo方法之前,它必须实际上被转换为给定的接口。

如何决定使用哪种方式?


注意:第二个声明在那里使用 public 是无效的。你不需要访问修饰符,因为显式实现的接口成员会自动变为 private - Mark H
我认为你问题的答案完全是主观的,并且取决于你试图解决的问题。 - asawyer
@asawyer:是的 - 我正在寻找一个大致的规则 - 不一定是圣经。 - Billy ONeal
4个回答

5
如果存在冲突(两个接口具有相同签名的方法,或者您的类/基类和一个接口以相同的方式发生冲突),并且您不希望冲突的方法具有相同的主体,则必须使用显式接口。否则,您可以自由选择。如果您想隐藏某些已实现的方法,则选择显式方法。例如,Dictionary<,> 类在 ICollection<> 接口的某些方法中这样做,因为隐藏的方法会使人们感到困惑。

2
有些情况下,你需要提供一个显式实现,例如在实现IEnumerable和IEnumerable<>接口时,两个接口都公开了一个GetEnumerator方法。
我遵循的一个通用规则是,如果我实现了一个接口,但提供了额外的更方便和类型安全的方法和属性来公开接口功能,我会显式地实现该接口。这使得类公开的公共接口更加适当,同时仍允许可能依赖于实现接口的算法访问所提供的方法和属性。
这很难表达,但我希望它有一定的意义。

1

我只会在实现多个接口且它们都包含同名方法的情况下才建议采用此方法。

你还可以显式实现一个方法来有效地“隐藏”它,并实现一个更好名称的等效方法。System.IO.Stream 就是这样做的,它显式地实现了 Dispose 方法并提供了更好命名的 Close() 方法。

详见此 MSDN 文章获取更多信息: http://msdn.microsoft.com/en-us/library/ms229034.aspx


0

这通常被视为 .NET 禁止“返回类型协变”的一种解决方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接