隐式<>显式接口[重复]
Posted
技术标签:
【中文标题】隐式<>显式接口[重复]【英文标题】:Implicit <> Explicit interface [duplicate] 【发布时间】:2011-09-02 15:19:31 【问题描述】:可能的重复:C#: Interfaces - Implicit and Explicit implementationimplicit vs explicit interface implementation
你好
谁能解释一下隐式接口和显式接口之间的区别?
谢谢!
【问题讨论】:
相关列表中大约有十几个精确的骗子...... 【参考方案1】:当你显式地实现一个接口时,该接口上的方法只有在对象被作为接口引用时才可见:
public interface IFoo
void Bar();
public interface IWhatever
void Method();
public class MyClass : IFoo, IWhatever
public void IFoo.Bar() //Explicit implementation
public void Method() //standard implementation
如果您的代码中某处有对该对象的引用:
MyClass mc = new MyClass();
mc.Bar(); //will not compile
IFoo mc = new MyClass();
mc.Bar(); //will compile
对于标准实现,如何引用对象并不重要:
MyClass mc = new MyClass();
mc.Method(); //compiles just fine
【讨论】:
【参考方案2】:隐式接口实现是指您拥有具有相同接口签名的方法。
显式接口实现是显式声明方法所属的接口。
interface I1
void implicitExample();
interface I2
void explicitExample();
class C : I1, I2
void implicitExample()
Console.WriteLine("I1.implicitExample()");
void I2.explicitExample()
Console.WriteLine("I2.explicitExample()");
MSDN:implicit and explicit interface implementations
【讨论】:
那在使用上有什么区别呢?为什么你更喜欢其中一个? 当您有 2 个具有相同方法签名的接口时,您可以显式声明 2 个实现每个方法的方法。或者,如果您希望明确存在用于实现接口的方法,则可以显式声明。存在隐式声明是因为大多数情况下您并不需要显式声明,并且可以假设接口实现。【参考方案3】:显式表示您指定接口,隐式表示您不指定。
例如:
interface A
void A();
interface B
void A();
class Imp : A
public void A() // Implicit interface implementation
class Imp2 : A, B
public void A.A() // Explicit interface implementation
public void B.A() // Explicit interface implementation
【讨论】:
因此,类 Imp 中的 public void A 是一个隐式接口,因为它是在该类中创建的,并且没有对接口 A 的引用(不是 A.A() )。如果它是 A.A() 它会是一个显式接口?那在使用上有什么区别呢? @Killerwes - 这是 实施 方面,因此您是正确的。我必须在Imp2
中明确说明,因为两个接口都声明了相同的成员。在调用代码时,您需要正确的接口引用才能调用 Imp2
的不同显式实现。【参考方案4】:
另外,如果您想知道为什么存在显式实现,那是因为您可以从多个接口实现相同的方法(名称和签名);那么如果你需要不同的功能,或者只是返回类型不同,你不能通过简单的重载来实现。那么你将不得不使用显式实现。一个例子是List<T>
实现了IEnumerable
和IEnumerable<T>
,两者都有GetEnumerator()
,但返回值不同。
【讨论】:
以上是关于隐式<>显式接口[重复]的主要内容,如果未能解决你的问题,请参考以下文章
区别 b/w 在 C# 中隐式实现成员和显式实现成员 [重复]