我来自一个C++的世界,你可能知道在那里只有一个关键字用于虚方法,即virtual
。因此,在C++中,您可以使用相同的virtual
关键字(在C#中使用override
)在派生类中重新定义虚拟方法。我完全了解多态以及在C#中如何使用“override”和new
。然而,我无法在书籍中找到是否有一些概念在创建基类和派生类中的两个不同的虚拟方法关键字,即virtual
和override
对应?还是只是为了清晰起见而这样做的?
我来自一个C++的世界,你可能知道在那里只有一个关键字用于虚方法,即virtual
。因此,在C++中,您可以使用相同的virtual
关键字(在C#中使用override
)在派生类中重新定义虚拟方法。我完全了解多态以及在C#中如何使用“override”和new
。然而,我无法在书籍中找到是否有一些概念在创建基类和派生类中的两个不同的虚拟方法关键字,即virtual
和override
对应?还是只是为了清晰起见而这样做的?
这是一个好问题。
你可以使用 override
关键字来重写虚方法,因为你可以在派生类中定义第二个与基类虚方法签名相同的 virtual
方法,并且它也可以被重写。
以下是来自 MSDN 的实际示例:
using System;
class A
{
public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
new public virtual void F() { Console.WriteLine("C.F"); }
}
class D: C
{
public override void F() { Console.WriteLine("D.F"); }
}
class Test
{
static void Main() {
D d = new D();
A a = d;
B b = d;
C c = d;
a.F();
b.F();
c.F();
d.F();
}
}
B.F
B.F
D.F
D.F
原因是:
C 和 D 类包含两个具有相同签名的虚方法:一个由 A 引入,一个由 C 引入。C 引入的方法隐藏了从 A 继承的方法。因此,D 中的覆盖声明覆盖了由 C 引入的方法,D 无法覆盖由 A 引入的方法。
为了清晰起见,我假设一些事情。个人而言,我更喜欢在更改父类行为时使用override关键字。此外,我认为这样做可以更清楚地表明C#不允许多重继承,而C++中的一个类可能会同时继承自祖父类和父类。
override
关键字交叉检查重写虚函数的签名(注意,它不会放置在与virtual
相同的位置)。 - Ben Voigtnew
,则它们会调用自己的方法。如果您使用override
,则基类和派生类将使用重写的方法(即在派生类中定义的方法)。 - Erkan Demirel