公共虚拟空间中的派生类在哪里?

时间:2014-10-13 00:58:32

标签: c# .net

我是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)
    {
    }
}

我已经读过虚拟意味着派生类会覆盖它,但我不知道发生了什么。任何人都能解释一下吗?

感谢您的回复。很难理解。我没有看到任何类使用冒号":",也没有看到任何"覆盖"在任何声明中。

3 个答案:

答案 0 :(得分:3)

您提供的代码中没有任何地方发生这种情况。这部分:

foreach (Work_Base Work in Works)

表示Works是一个包含对象的列表,其中每个对象的类型为Work_Base,或者是继承Work_Base的类型。该代码中没有任何迹象表明每个代码。您可以通过多种方式确定每个项目的类型,例如

Console.WriteLine(Work.GetType())

这会告诉你当前项目的实际类型。一旦知道该类型,就可以专门查找该类型的实现。

如上所述,源自Work_Base 的任何类型都可以覆盖Calc,但他们不必 。如果他们不这样做,那么调用他们的Calc方法将只调用基本实现,它不执行任何操作。如果Work_Base的作者想要求每个派生类都实现他们自己的Calc方法,那么他们必须声明它abstract而不是在基类中实现它。

答案 1 :(得分:0)

首先,虚拟意味着每个派生类都有权使用关键字'覆盖'重写你的方法。

但是你没有被迫重写它。

但是你应该知道这些只发生在派生类中,而不是你当前的基类。

你需要学习c#内在机制和差异btw关键词' new'并且'覆盖'。

答案 2 :(得分:0)

  

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