在2个不同的接口中有2个方法的相同名称,为什么不实现1?

时间:2017-01-28 14:04:34

标签: c# interface

如果我有两个具有相同名称但具有不同返回类型的方法。它们由2个接口的类继承。如果实现的返回类型符合两个接口中的返回类型,则此类可以为两者提供1个实现。

例如,String类型实现了两种方法:IEnumerableIEnumerable<char>String类型的实现只包含GetEnumerator的一个实现。

public CharEnumerator GetEnumerator();

我认为这是可能的,因为CharEnumerator同时实现IEnumeratorIEnumerator<char>

public CharEnumerator: IEnumerator, IEnumerator<char>

但是,我下面的应用程序中的类似代码给出了编译错误,

interface Ia { IEnumerator o();}
interface Ib { IEnumerator<int> o();}
class e : IEnumerator, IEnumerator<int>{}
class c : Ia, Ib { public e o() { return new e(); } }

如果我在Visual Studio中对String类型执行F12,我会看到如下所示的内容, enter image description here

正如您所看到的,GetEnumerator()只有一个隐式实现,没有明确的实现

1 个答案:

答案 0 :(得分:2)

字符串不隐式实施IEnumerableIEnumerable<char>。它明确地这样做,这意味着您只能通过IEnumerableIEnumerable<char>引用访问这些方法。

方法CharEnumerator GetEnumerator()不实现接口,因为返回类型不是IEnumeratorIEnumerator<T>; CharEnumerator可能是IEnumerator,但界面要求任何 IEnumerator

显式接口非常有用,您只是偶然发现它们提供的一个功能;在一个类中实现定义具有相同名称的方法的不同接口:

interface IFoo
{
    IFoo Frob();
}

interface IBar
{
    IBar Frob();
}

public class Blah: IFoo, IBar
{
    Foo IFoo.Frob() => new Foo();
    Bar IBar.Frob() => new Bar();
    void Frob();
}

现在,您将获得以下行为:

var b = new Blah();
b.Frob(); //returns nothing, this method is not implementing any of the two interfaces.
(b as IBar).Frob(); //returns a bar
(b as IFoo).Frob(); //returns a foo