2017-01-14 68 views
2

我在阅读有关隐式或显式接口方法的实现,但我仍不明白它是如何工作的以及有哪些好处。接口实现:隐式与显式

具有代码:

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. 有什么好处?

+0

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

回答

1

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

因为这就是显式接口实现的工作原理。它允许你有两个版本的相同的方法。使用的方法由用于调用它的参考类型决定。

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

它使用类型推断。 documentation指出:

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

所以它要使用任何类型的右侧返回

是什么好处?

大部分时间没有。但是如果你希望你的对象在通过某个接口访问时采取不同的行为,这就是实现它的方法。

+0

你能给我一个链接,指出“编译器选择了最可能的选择”吗? –

+0

@BudaGavril我的不好,它似乎只是使用任何权利。无论如何都添加了链接 – BradleyDotNET

0

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

这是更多的事情,因为有时候这是必要的,不是因为它应该是你的设计的计划A.

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

没有显式接口实现,你将无法拥有它实现了两个,并为他们提供不同的实现类。