我是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)
{
}
}
我已经读过虚拟意味着派生类会覆盖它,但我不知道发生了什么。任何人都能解释一下吗?
感谢您的回复。很难理解。我没有看到任何类使用冒号":",也没有看到任何"覆盖"在任何声明中。
答案 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