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方法之前将其实际转换为给定接口。

如何决定使用哪一个?

4

4 回答 4

5

如果存在冲突(两个接口具有相同签名的方法,或者您的类/基类和接口以相同方式冲突),并且您不希望冲突方法具有相同的主体,那么您必须使用显式接口。

否则,您可以自由选择。如果你想隐藏一些实现的方法,你选择显式方法。例如,Dictionary<,> 类使用 ICollection<> 接口的一些方法来实现,因为隐藏的方法会使人感到困惑。

于 2010-12-29T18:37:03.467 回答
2

在某些情况下,您必须提供显式实现,例如在实现 IEnumerable 和 IEnumerable<> 时,这两个接口都公开了一个GetEnumerator方法。

我遵循的一个一般规则是,如果我实现了一个接口,但提供了额外的更方便和类型安全的方法和属性来公开接口功能,我将显式地实现该接口。这使得类公开的公共接口更合适,同时仍然允许可能依赖于已实现接口的算法访问接口提供的方法和属性。

这很难说,但我希望它是有道理的。

于 2010-12-29T18:38:10.377 回答
1

我只会在实现多个接口并且它们都包含同名方法的情况下建议这样做。

您还可以显式实现一个方法来有效地“隐藏”它并实现一个具有更好名称的等效方法。System.IO.Stream 执行此操作,显式实现 Dispose 并提供更好命名的 Close()。

有关更多信息,请参阅此 MSDN 文章:http: //msdn.microsoft.com/en-us/library/ms229034.aspx

于 2010-12-29T18:45:43.063 回答
0

它最常被视为 .NET 禁止“返回类型协方差”的解决方法。

于 2010-12-29T19:02:05.063 回答