隐式与显式接口实现

可能重复:
C#:接口 - 隐式和显式实现

有人会解释这两个野兽之间的差异以及如何使用它们。 AFAIK,很多pre.2.0类都是在没有泛型类型的情况下实现的,因此后一版本实现了两种接口类型。 是唯一需要使用它们的情况吗?

你能否深入解释如何使用它们?

谢谢


这里有一篇很好而且非常详细的博客文章。

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

对于何时使用其中一个,有时您必须使用明确的接口实现,因为您的接口具有与接口具有相同签名的属性/方法,或者要实现具有相同签名且具有不同实现的两个接口那些匹配的属性/方法。

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

  • 不要使用显式成员作为安全边界。 它们可以由任何向接口投射实例的客户端调用。
  • 请使用显式成员来隐藏实现细节
  • 请使用显式成员来近似私有接口实现。
  • 公开一种替代方式来访问允许子类被重写的任何显式实现的成员。 使用相同的方法名称,除非发生冲突。
  • 在Brad的博客中的评论中也提到,在对值类型使用显式实现时涉及拳击,因此要注意性能成本。


    通俗地说,如果一个类继承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();
    }
    

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


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

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

    链接地址: http://www.djcxy.com/p/50419.html

    上一篇: implicit vs explicit interface implementation

    下一篇: Why implement interface explicitly?