我有以下代码:
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;
}
}
尽管我没有实现接口(interface),但以下语句工作正常并且程序编译:
Calculator calculator = new Calculator();
Console.WriteLine ( calculator.Sum(10, 20) );
所以我的第一个问题是:它为什么有效?
然后,我将以下接口(interface)实现添加到 Calculator 类:
int ICalculator.Sum(int x, int y)
{
Console.WriteLine("From implemented method");
return x + y;
}
再次尝试以下语句时:
Calculator calculator = new Calculator();
Console.WriteLine ( calculator.Sum(10, 20) );
从抽象中覆盖的方法仍然被调用。 所以我的第二个问题是:为什么程序调用抽象类的方法而不是接口(interface)的方法?
最佳答案
在 C# 中有两种实现接口(interface)的方法,显式或隐式,但 CLR 只有一种实现类型 - 显式。
当 C# 编译器发现一个类必须实现一个接口(interface)时,它会查找与该接口(interface)所需类的签名匹配的方法,并指示 CLR 这些是实现,以保存您的代码。
因此,在您的情况下,当 C# 编译器发现您的类实现了 ICalculator 时,它将寻找与 Sum(int, int) 的签名匹配的公共(public)方法,并将该方法视为实现。该方法被覆盖的事实并不重要。
如果要对方法的实现赋予另外的含义,则应显式赋予。
关于c# - 尽管未实现接口(interface),代码仍能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19739776/