【发布时间】:2010-10-10 13:37:29
【问题描述】:
谁能解释这两种野兽之间的区别以及如何使用它们。 AFAIK,许多 pre.2.0 类是在没有泛型类型的情况下实现的,因此导致后一个版本实现了两种类型的接口。是唯一需要使用它们的情况吗?
您能否也深入解释一下如何使用它们?
谢谢
【问题讨论】:
谁能解释这两种野兽之间的区别以及如何使用它们。 AFAIK,许多 pre.2.0 类是在没有泛型类型的情况下实现的,因此导致后一个版本实现了两种类型的接口。是唯一需要使用它们的情况吗?
您能否也深入解释一下如何使用它们?
谢谢
【问题讨论】:
There is a good and pretty detailed blog post about this.
基本上,通过隐式接口实现,您可以访问接口方法和属性,就好像它们是类的一部分一样。对于显式接口实现,您只能在将其视为该接口时访问它们。
就何时使用一个而不是另一个而言,有时您必须使用显式接口实现,因为您要么拥有与接口具有相同签名的属性/方法,要么您想要实现具有相同签名的两个接口并具有匹配的属性/方法的不同实现。
以下规则来自 Brad Abrams design guidelines blog。
Brad 博客中的 cmets 也提到,在对值类型使用显式实现时会涉及到装箱,因此请注意性能成本。
【讨论】:
通俗的讲,如果一个类继承了 2 个或多个接口,并且这些接口碰巧有相同的方法名,那么如果你使用隐式接口实现,该类不知道正在实现哪个接口方法。这是显式实现接口的场景之一。
隐式接口实现
public class MyClass : InterfaceOne, InterfaceTwo
{
public void InterfaceMethod()
{
Console.WriteLine("Which interface method is this?");
}
}
interface InterfaceOne
{
void InterfaceMethod();
}
interface InterfaceTwo
{
void InterfaceMethod();
}
显式接口实现
public class MyClass : InterfaceOne, InterfaceTwo
{
void InterfaceOne.InterfaceMethod()
{
Console.WriteLine("Which interface method is this?");
}
void InterfaceTwo.InterfaceMethod()
{
Console.WriteLine("Which interface method is this?");
}
}
interface InterfaceOne
{
void InterfaceMethod();
}
interface InterfaceTwo
{
void InterfaceMethod();
}
以下链接有一个很好的视频来解释这个概念
Explicit Interface Implementation
【讨论】:
还有另一种方式来看待它,从迷宫般的实现本身来看:http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx。
但简而言之,隐式实现为您提供了 is-a 类型转换,除非对象被显式类型转换为该接口类型,否则显式实现将不可访问。
【讨论】: