其中,公共虚拟虚空中的派生类

本文关键字:空中的 派生 虚拟 其中 | 更新日期: 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