我正在阅读有关隐式或显式接口方法实现的内容,但我仍然不明白它是如何工作的以及有什么好处。
拥有代码:
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();
这是输出:
你好,来自类方法
你好,来自界面方法
我的问题:
为什么我没有错误,有两个方法具有相同名称和签名的类?
当我使用var关键字时,编译器如何选择调用哪个方法?
有什么好处?
答案 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.