尽管没有实现接口,代码工作仍未实现

Bra*_*iat 8 c# interface

我有以下代码:

 interface ICalculator
 {
     int Sum ( int x,  int y);
 }

 abstract class AbsCalculator
 {
     public abstract int Sum(int x, int y);
 }

 class Calculator : AbsCalculator, ICalculator
 {
     public override int Sum(int x, int y)
     {
         Console.WriteLine ( "From overriden method" );
         return x + y;
     }
 }
Run Code Online (Sandbox Code Playgroud)

以下语句工作正常,程序编译,尽管我没有实现接口:

Calculator calculator = new Calculator();
Console.WriteLine ( calculator.Sum(10, 20) );
Run Code Online (Sandbox Code Playgroud)

所以我的第一个问题是:它为什么有用?

然后,我将以下接口实现添加到Calculator类:

int ICalculator.Sum(int x, int y)
{
     Console.WriteLine("From implemented method");
     return x + y;
}
Run Code Online (Sandbox Code Playgroud)

再次尝试以下声明时:

Calculator calculator = new Calculator();
Console.WriteLine ( calculator.Sum(10, 20) );
Run Code Online (Sandbox Code Playgroud)

该方法从仍然被调用的抽象中重写.所以我的第二个问题是:为什么程序从抽象类调用方法而不是从接口调用方法?

bbe*_*eda 5

有两种方法可以在C#中实现接口,无论是显式还是隐式,但CLR只有一种类型的实现 - 显式的.

当C#编译器发现某个类必须实现一个接口时,它会查找与该接口所需类的签名匹配的方法,并指示CLR这些是实现,以保存代码.

因此,在您的情况下,当C#编译器发现您的类实现了ICalculator时,它将查找与Sum(int,int)的签名匹配的公共方法,并将该方法视为实现.该方法被覆盖的事实并不重要.

如果您想为该方法的实现赋予另一种含义,您应该明确地给它.