gpt4 book ai didi

c# - 为什么当两个类在继承链中并且中间的类为空时调用接口(interface)的默认实现

转载 作者:行者123 更新时间:2023-12-04 11:18:50 25 4
gpt4 key购买 nike

概括
我发现在接口(interface)和另一个派生类之间插入一个类会导致调用接口(interface)的默认实现而不是同一方法的派生实现。这是意料之外的行为。为什么会这样?
例子
我创建了一个重现问题的示例项目:

    public interface IPrinterInterface
{
public void PrintIt() => Console.WriteLine("Interface");
}

public class MiddlePrinter : IPrinterInterface{}

public class Printer : MiddlePrinter
{
public void PrintIt() => Console.WriteLine("Class");
}

class Program
{
static void Main(string[] args)
{
var printer = (IPrinterInterface)new Printer();
printer.PrintIt(); // This prints "Interface"
Console.ReadLine(); // so the app sits
}
}
此代码导致 Interface被打印出来。
相比之下,如果从继承中移除 MiddlePrinter 类(如下面的代码所示),则代码打印“Class”:
    public interface IPrinterInterface
{
public void PrintIt() => Console.WriteLine("Interface");
}

public class Printer : IPrinterInterface
{
public void PrintIt() => Console.WriteLine("Class");
}

class Program
{
static void Main(string[] args)
{
var printer = (IPrinterInterface)new Printer();
printer.PrintIt(); // This prints "Class"
Console.ReadLine(); // so the app sits
}
}
我没想到会看到这种行为,有人可以解释为什么会这样吗?
平台
这已在 .NET5 控制台应用程序和现代 Xamarin Android 应用程序中重现。

最佳答案

类不从接口(interface)继承成员,即使是默认实现也是如此。 Source .

Note that a class does not inherit members from its interfaces; that is not changed by this feature


因此,由于 MiddlePrinter不包含 Printer 的继承成员覆盖, PrintIt() 最具体的实现来自 IPrinterInterface的观点是它自己的默认实现。
通过尝试应用 override 可以明显看出这一点。关键字到 Printer.PrintIt() .您将收到一个错误,指出找不到合适的方法来覆盖。
MiddlePrinter , Printer通过替换默认值提供更具体的实现。

关于c# - 为什么当两个类在继承链中并且中间的类为空时调用接口(interface)的默认实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68185390/

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