gpt4 book ai didi

c# - 函数覆盖不调用

转载 作者:行者123 更新时间:2023-12-05 01:03:12 26 4
gpt4 key购买 nike

我正在编写的程序有问题,我的虚拟函数似乎没有按应有的方式运行。

我有一个带有虚函数的类,以及一个覆盖它的派生类。当我调用该函数时,不会调用覆盖,但会调用基础。这是我之前做过一百万次的事情,但我不知道这种行为在简单的情况下是如何破坏的。

举个例子:

public class ClassA
{
public DoStuff()
{
MyVirtual()
}

protected virtual MyVirtual()
{
Console.WriteLine("Base MyVirtual Called");
}
}

public class ClassB : ClassA
{
protected override MyVirtual()
{
Console.WriteLine("Overridden MyVirtual Called");
}
}

ClassA test = new ClassB;
test.DoStuff();

这个例子只是为了效果(我没有编译它来检查它,我只是演示)。我只想知道什么会破坏它,所以不会调用覆盖。我不能粘贴我的具体代码,但理论上就是这么简单。

  • 继承层次只有两个类
  • 没有密封的修饰符
  • 类是通过对继承类的简单调用 new 来创建的
  • 虚函数受到保护,并像这样从基类中的公共(public)函数调用

这怎么可能破坏或者什么会干扰这种行为?该项目非常复杂,但这并不是我正在实现的新事物。在我的特定代码中,甚至还有另一个以完全相同的方式编写并以相同方式继承的虚函数,效果很好。我什至通过复制/粘贴该函数并重命名来创建新函数,因此语法应该相同(当它们不起作用时我确实从头开始重建它们,但它们的行为没有区别)。

无论如何,我都束手无策,我不能花几天时间为此寻找一个模糊的原因,所以任何关于从哪里开始寻找的想法都将不胜感激。

最佳答案

如果您修复错误,它会成功编译并按预期运行。

固定版本:

public class ClassA
{
public void DoStuff()
{
MyVirtual();
}

protected virtual void MyVirtual()
{
Console.WriteLine("Base MyVirtual Called");
}
}

public class ClassB : ClassA
{
protected override void MyVirtual()
{
Console.WriteLine("Overridden MyVirtual Called");
}
}

ClassA test = new ClassB();
test.DoStuff();

输出:

Overridden MyVirtual Called

这基本上意味着,与您的陈述相反,您的代码“理论上没有那么简单”,我的猜测是 您实际上并没有在 B 类中覆盖

关于c# - 函数覆盖不调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16014391/

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