我在 C# 多态性中从 MSDN 资源中选择了这个代码。
public class A
{
public virtual void DoWork() { }
}
public class B : A
{
public override void DoWork() { }
}
public class C : B
{
public override void DoWork()
{
// Call DoWork on B to get B's behavior:
base.DoWork();
// DoWork behavior specific to C goes here:
// ...
}
}
它说 C 类覆盖 B 的 DoWork(),但 B 类的 DoWork() 方法不是虚拟的。既然 C 继承了 B 的所有方法和数据,那么它是否也继承了 A 的虚方法(在 B 中可用,因为 A 是 B 的基类)?
如果 B 不提供 DoWork() 的实现,那么 C 会直接访问 A 的虚拟方法的副本以覆盖它吗?
此外,当 C 从 B 继承时,它会获得 A 成员的单独副本还是 B 成员的副本。我想对于 A 成员的单独副本,必须单独继承 A,例如
public class C : A, B
如果错了请纠正我。
编辑 :
public class A
{
public virtual void DoWork()
{
Console.WriteLine("In Class A");
}
}
public class B : A
{
public void DoWork() { Console.WriteLine("In Class B"); }
}
public class C : B
{
public void DoWork()
{
Console.WriteLine("In Class C");
base.DoWork();
}
}
当我在 VS C# 上运行它时,不需要虚拟关键字。在 B 类的 DoWork() 中,并在 B 类和 C 的 DoWork() 中覆盖关键字,因为它只生成一个提示警告。那么这是否意味着只指定在类名定义中派生哪个基类,就像在公共类 C 中一样:B 足以使他的方法在本质上是虚拟的?
此外,由于 C# 不提供类的多重继承选项,有没有办法直接使用 C 类中 A 的 DoWork() 实现,而不显式创建 A 的对象,然后使用它访问 DoWork()?