接口实现:隐式vs显式

时间:2017-01-14 00:23:03

标签: c# interface

我正在阅读有关隐式或显式接口方法实现的内容,但我仍然不明白它是如何工作的以及有什么好处。

拥有代码:

interface InterfaceOne
{
    void MethodOne();
}

class ClassOne : InterfaceOne
{
    public void MethodOne()
    {
        Console.WriteLine("hello from the class method");
    }

    void InterfaceOne.MethodOne()
    {
        Console.WriteLine("hello from the interface method");
    }
}

主要方法的代码:

    var c1 = new ClassOne();
    c1.MethodOne();

    InterfaceOne i1 = new ClassOne();
    i1.MethodOne();
    Console.ReadLine();

这是输出:

  

你好,来自类方法

     

你好,来自界面方法

我的问题:

  1. 为什么我没有错误,有两个方法具有相同名称和签名的类?

  2. 当我使用var关键字时,编译器如何选择调用哪个方法?

  3. 有什么好处?

3 个答案:

答案 0 :(得分:1)

  

为什么我没有错误地让一个类有两个具有相同名称和签名的方法?

因为这是显式接口实现的工作原理。它允许您拥有相同方法的两个版本。使用的方法取决于用于调用它的引用类型。

  

当我使用var关键字时,编译器如何选择调用哪个方法?

正在使用类型推断。 documentation州:

  

可以给局部变量一个推断的"类型" var而不是显式类型。 var关键字指示编译器从初始化语句右侧的表达式中推断变量的类型

所以它将使用右手边返回的任何类型

  

有什么好处?

大部分时间都没有。但是如果你希望你的对象在通过某个界面访问时采取不同的行为,那就是这样做的。

答案 1 :(得分:1)

  

为什么我没有错误,有一个带有两个方法的类   同名和签名?

因为你正在使用允许的语言功能。

  

当我使用var关键字时,编译器如何选择哪个方法   打电话?

使用var并不重要。重要的是调用方法的变量类型。

var c1 = new ClassOne();
InterfaceOne i1 = new ClassOne();

var c1Result = c1.MethodOne();
var c2Result = c2.MethodOne();
  

有什么好处?

它主要是为了允许使用相同的方法实现多个接口:

interface One {
    int Foo();
}

interface Two {
    int Foo();
}

如果没有显式的接口实现,您将无法拥有一个实现它们的类,并为它们提供不同的实现。

答案 2 :(得分:0)

明确的好处是,有时您需要它来解决歧义。想象一下,您需要在同一个类中实现两个不同的接口,这两个接口都有一个同名的方法。

有更多的东西,因为有时它是必要的,而不是因为它应该是你设计的计划A.