C# - 我什么时候需要覆盖?什么时候不需要呢?

时间:2014-07-16 05:16:55

标签: c# unity3d

我在Unity3d上使用C#。

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

当我创建自己的类并覆盖一个函数时,我确实需要使用override关键字。

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

2 个答案:

答案 0 :(得分:3)

我认为你的困惑来自于Unity对这些方法做了一些特别的事情(UpdateStartAwake等等。您可以将它们声明为私有,即使这样它们也会被调用。除非你使用反射,否则使用该语言无法实现,但我被告知他们不使用它,所以我不知道他们做了什么。老实说,这没关系。因为您可以认为这是该语言的一个例外,也就是说,如果您实现它们,将调用这些方法。就是这样。

对于所有其他人,你必须遵循语言。这是一个粗略的解释:

如果某个方法在基类中标记为overrideabstract,则可以或必须virtual

当基类希望其子代实现它时,方法是abstract。当基类提供它的实现时,方法是virtual,但也为子项提供了实现/修改该方法的机会。

那么为什么所有方法都不能“覆盖”?保护基类开发人员的意图。您将更改基类的行为,您不知道基类开发人员是否希望您这样做。这就像一个安全锁。这就是为什么你有三个单词abstractvirtualoverride来将基本类的API意图传达给他们的孩子。

答案 1 :(得分:1)

当您从另一个类派生类并且需要更改基类的方法override的代码时,您需要使用virtual。这样,基类的继承方法可以具有不同的行为 - 更适合派生类。

更一般地说,如MSDN中所述:

  

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