我有以下代码:
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)
该方法从仍然被调用的抽象中重写.所以我的第二个问题是:为什么程序从抽象类调用方法而不是从接口调用方法?
有两种方法可以在C#中实现接口,无论是显式还是隐式,但CLR只有一种类型的实现 - 显式的.
当C#编译器发现某个类必须实现一个接口时,它会查找与该接口所需类的签名匹配的方法,并指示CLR这些是实现,以保存代码.
因此,在您的情况下,当C#编译器发现您的类实现了ICalculator时,它将查找与Sum(int,int)的签名匹配的公共方法,并将该方法视为实现.该方法被覆盖的事实并不重要.
如果您想为该方法的实现赋予另一种含义,您应该明确地给它.