gpt4 book ai didi

c# - 如何知道 virtual\override 中的大多数派生实现

转载 作者:行者123 更新时间:2023-11-30 23:14:53 24 4
gpt4 key购买 nike

我无法弄清楚方法调用的确切原因,在多级继承的情况下如何知道在有多个virtual和override时调用哪个方法?

 public class A
{
public virtual void f1()
{
Console.WriteLine("A");
}
}

public class B:A
{
public override void f1()
{
Console.WriteLine("B");
}
}

public class C:B
{
public override void f1()
{
Console.WriteLine("C");
}
}

public class D:C
{
public virtual void f1()
{
Console.WriteLine("D");
}
}

public class E : D
{
public override void f1()
{
Console.WriteLine("E");
}
}


A aobj = new D();
aobj.f1();
//why output is "C" here

A aobj = new E();
aobj.f1();
//why output is again "C" and not "E"

我很困惑,需要其他人的帮助才能理解,编译器如何决定调用哪个函数?

最佳答案

在您的示例中,virtual 关键字用于 D.f1(),而不是 override。无需将 D.f1() 标记为 virtual,因为基方法 A.f1() 已经是虚拟的。

我不确定您是否注意到您当前的代码抛出一个 CS0114 警告:

CS0114: 'D.f1()' hides inherited member 'C.f1()'. 
To make the current member override that implementation, add the override keyword.
Otherwise add the new keyword.

class D 更改为以下内容将更正问题:

public class D:C
{
public override void f1() // Notice use of 'override' instead of 'virtual'
{
Console.WriteLine("D");
}
}

通过上述更改,返回预期的输出:

D
E

看看这两个讨论非常相似问题的问题:


编辑:行为背后的基本原理

aobjclass A 的实例。因此,从基类 A 向上工作以确定调用了哪个版本的 f1()最高覆盖方法C.f1(),因此将调用它。在 D 类中,通过使用 virtual 打破了覆盖的层次结构,因此 D.f1()E.f1() 不是在使用 class A 的实例时调用。

关于c# - 如何知道 virtual\override 中的大多数派生实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42883453/

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