其中,公共虚拟虚空中的派生类
本文关键字:空中的 派生 虚拟 其中 | 更新日期: 2023-09-27 18:26:16
我是c#的新手,不懂别人的代码。 有一个名为 SolutionStep 的类。 它包含一个名为
public static void Calc (SolutionData SD, RunData RD)
其中,有一个呼吁
WorkEntryPoint.CalcDervs(RD)
在CalcDervs中,有这两条线
WorkBlock DervsBlock = WorkBlock.Get(RD);
DervsBlock.Calc()
在 WorkBlock 类中,Calc 被定义为:
public void Calc()
{
foreach (Work_Base Work in Works)
{
Work.Calc(RunDataBlock);
}
}
类Work_Base如下所示:
public class Work_Base
{
public Work_Base()
{
WorkStack.Add(this);
}
public virtual void Calc(RunData RD)
{
}
}
我已经读到虚拟意味着派生类将覆盖它,但我看不到这是在哪里发生的。 谁能说出一些启示?
感谢您的回复。 很难理解。 我没有看到任何派生冒号":"的类,也没有在任何声明中看到任何"覆盖"。
它不会发生在您提供的代码中的任何位置。 这部分:
foreach (Work_Base Work in Works)
表示Works
是一个包含对象的列表,其中每个对象都是类型 Work_Base
或继承Work_Base
的类型。 该代码中没有指示每个是哪个。 您可以通过多种方式确定每个项目的类型,例如
Console.WriteLine(Work.GetType())
这将告诉您当前项目的实际类型。 知道该类型后,可以专门查找该类型的实现。
如前所述,从Work_Base
派生的任何类型都可以覆盖Calc
但它们不必覆盖。 如果他们不这样做,那么调用他们的Calc
方法将简单地调用基实现,它什么也不做。 如果 Work_Base
的作者想要要求每个派生类实现自己的 Calc
方法,那么他们必须将其声明abstract
而不是在基类中实现它。
首先,virtual 意味着每个派生类都有权使用关键字"override"来重写你的方法。
但是,您不会被迫重写它。
但是您应该知道,这些只发生在派生类中,而不是当前的基类中。
你需要学习c#固有机制和区别,btw关键字"new"和"override"。
virtual 表示派生类将重写
virtual
意味着派生类可以覆盖它,即父类允许"合法"地这样做。
class WorkBase
{
public virtual void Calc() {}
}
class WorkA : WorkBase
{
public override void Calc() {}
}
WorkBase a = new WorkA();
a.Calc(); // overridden method is called
但是,如果:
class WorkBase
{
public void Calc() {} // no keyword 'virtual'
}
class WorkB : WorkBase
{
public new void Calc() {} // note keyword 'new'
}
然后:
WorkB b = new WorkB();
b.Calc(); // new method is called
WorkBase w = new WorkB();
w.Calc(); // base method id called