C# - 何时需要使用override?何时不需要使用?

4

我正在使用C#和Unity3D。

当我使用Monobehaviour并创建Update方法时,我不需要使用override关键字。

当我创建自己的类并重写函数时,我需要使用override关键字。

为什么?为什么在创建Update方法时我不需要使用override关键字?

2个回答

3
我认为你的困惑源于Unity在这些方法(UpdateStartAwake等)方面采取了一些特殊的处理方式。你可以将它们声明为private,即使如此它们也会被调用。除非你使用反射(reflection),否则语言本身无法实现这一点,但我听说它们没有使用反射,所以我不知道它们是如何做到的。但老实说,这并不重要,因为你可以将其视为语言的一���异常情况:如果你实现了这些方法,它们就会被调用。就是这样简单。

至于其他所有情况,你必须遵循语言规范。以下是一个简单的解释:

如果基类中标记了abstractvirtual,那么你可以或者必须override一个方法。

当基类希望其子类实现某个方法时,这个方法就是abstract的。当基类提供了一个实现方法但也为子类提供了实现/修改该方法的机会时,这个方法就是virtual的。

那么为什么不能将所有方法都设计成“可重写的”呢?为了保护基类开发者的意图。你会改变基类的行为,而你无法确定基类开发者是否希望你这样做,就像一把安全锁。因此,出现了abstractvirtualoverride这三个词,用于传达API意图从基类到其子类。


1
你需要使用 override,当你从另一个类派生一个类并且你需要改变基类的一个方法的代码时,这个方法必须是 virtual。这样,基类继承的方法可以对派生类有不同的行为-更适合派生类。
更一般地说,正如在 MSDN 中所述:

覆盖修饰符是必需的,用于扩展或修改继承方法、属性、索引器或事件的抽象或虚拟实现。


我如何创建一个情况,使我不必使用“override”这个词? - Ginger
这取决于你要做什么。我的意思是:让你定义一个带有一些方法的基类,然后基于这个基类定义一些派生类。如果你的基类中没有任何方法需要被重写,那么它们都不应该被标记为虚函数。最后,在派生类中,你将无法重写这些方法。 - Christos
另一方面,如果您选择从一个基类派生一个类,该基类具有一个(或多个)方法,其代码不反映您想要执行的操作,则如果这些方法不是虚拟的,则必须将它们标记为虚拟的,然后在派生类中重写它们。 - Christos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接