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

时间:2010-12-29 18:31:59

标签: c# interface explicit-implementation

实现接口有两种方法:

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 个答案:

答案 0 :(得分:5)

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

否则,您可以自由选择。如果要隐藏某些已实现的方法,请选择显式方法。例如,Dictionary<,> class使用ICollection的一些方法<>界面,因为隐藏的方法会让人迷惑。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

我只会在实现多个接口的情况下推荐这个,并且它们都包含一个同名的方法。

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

有关详情,请参阅此MSDN文章:http://msdn.microsoft.com/en-us/library/ms229034.aspx

答案 3 :(得分:0)

最常见的是.NET禁止“返回类型协方差”的解决方法。