关于c#:隐式vs显式接口实现

implicit vs explicit interface implementation

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
C#: Interfaces - Implicit and Explicit implementation

有人能解释一下这两种动物之间的区别以及如何使用它们吗?在afaik中,许多2.0之前的类都是在没有泛型类型的情况下实现的,因此,后一个版本实现了这两种风格的接口。唯一需要使用它们的原因是什么?

你也能详细解释一下如何使用它们吗?

谢谢


关于这一点,有一篇非常详细的博客文章。

基本上,通过隐式接口实现,您可以像访问类的一部分一样访问接口方法和属性。通过显式接口实现,您只能在将其视为该接口时访问它们。

在您将一个接口用于另一个接口的时间方面,有时您必须使用显式接口实现,因为您要么具有与接口具有相同签名的属性/方法,要么希望实现具有相同签名的两个接口,并对那些匹配的属性/方法具有不同的实现。

以下规则来自BradAbrams设计指南博客。

  • 不要将显式成员用作安全边界。任何将实例强制转换到接口的客户机都可以调用它们。
  • 使用显式成员隐藏实现详细信息
  • 请使用显式成员来近似私有接口实现。
  • 请公开另一种方法来访问允许子类重写的任何显式实现的成员。除非出现冲突,否则使用相同的方法名。

Brad博客中的评论中还提到,在对值类型使用显式实现时涉及装箱,因此要注意性能成本。


用外行的术语来说,如果一个类继承了两个或多个接口,并且接口恰好具有相同的方法名,那么如果使用隐式接口实现,那么该类就不知道正在实现哪个接口方法。这是您将显式实现接口的场景之一。

隐式接口实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyClass : InterfaceOne, InterfaceTwo
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

显式接口实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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();
}

下面的链接有一个很好的视频来解释这个概念
显式接口实现


从迷宫式实现本身来看,还有另外一种方法:http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx。

但简而言之,隐式实现为您提供了IS-A类型转换,除非对象显式类型转换为该接口类型,否则显式实现将不可访问。