gpt4 book ai didi

c# - 尽管未实现接口(interface),代码仍能正常工作

转载 作者:太空狗 更新时间:2023-10-29 18:20:14 25 4
gpt4 key购买 nike

我有以下代码:

 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com