【问题标题】:interface implementation: implicit vs explicit [duplicate]接口实现:隐式与显式 [重复]
【发布时间】:2017-01-14 00:23:02
【问题描述】:

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

有代码:

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");
    }
}

以及来自 main 方法的代码:

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

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

这是输出:

来自类方法的你好

来自接口方法的你好

我的问题:

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

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

  3. 有什么好处?

【问题讨论】:

  • @MarcinJuraszek 它不是重复的,因为你提到的问题没有回答我的第二个问题

标签: c# interface


【解决方案1】:

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

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

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

它正在使用类型推断。 documentation 声明:

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

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

有什么好处?

大多数时候,没有。但是如果你希望你的对象在通过某个接口访问时表现不同,这就是这样做的方法。

【讨论】:

  • 你能给我一个链接,上面写着“编译器选择最可能的选择”吗?
  • @BudaGavril 我的错,它似乎只是使用右边的任何东西。还是添加了链接
【解决方案2】:

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

因为您使用的语言功能允许这样做。

当我使用 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();
}

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

【讨论】:

    【解决方案3】:

    Explicit 的好处是有时您需要它来解决歧义。想象一个场景,你需要在同一个类中实现两个不同的接口,它们都有一个同名的方法。

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

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 2012-03-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2010-10-21
      相关资源
      最近更新 更多