如果我有两个具有相同名称但具有不同返回类型的方法。它们由2个接口的类继承。如果实现的返回类型符合两个接口中的返回类型,则此类可以为两者提供1个实现。
例如,String
类型实现了两种方法:IEnumerable
和IEnumerable<char>
。 String
类型的实现只包含GetEnumerator
的一个实现。
public CharEnumerator GetEnumerator();
我认为这是可能的,因为CharEnumerator
同时实现IEnumerator
和IEnumerator<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,我会看到如下所示的内容,
正如您所看到的,GetEnumerator()
只有一个隐式实现,没有明确的实现
答案 0 :(得分:2)
字符串不隐式实施IEnumerable
或IEnumerable<char>
。它明确地这样做,这意味着您只能通过IEnumerable
或IEnumerable<char>
引用访问这些方法。
方法CharEnumerator GetEnumerator()
不实现接口,因为返回类型不是IEnumerator
或IEnumerator<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