我在Unity3d上使用C#。
当我使用Monobehaviour并创建Update方法时,我不需要使用override关键字。
当我创建自己的类并覆盖一个函数时,我确实需要使用override关键字。
为什么?为什么在创建Update方法时不需要override关键字?
答案 0 :(得分:3)
我认为你的困惑来自于Unity对这些方法做了一些特别的事情(Update
,Start
,Awake
等等。您可以将它们声明为私有,即使这样它们也会被调用。除非你使用反射,否则使用该语言无法实现,但我被告知他们不使用它,所以我不知道他们做了什么。老实说,这没关系。因为您可以认为这是该语言的一个例外,也就是说,如果您实现它们,将调用这些方法。就是这样。
对于所有其他人,你必须遵循语言。这是一个粗略的解释:
如果某个方法在基类中标记为override
或abstract
,则可以或必须virtual
。
当基类希望其子代实现它时,方法是abstract
。当基类提供它的实现时,方法是virtual
,但也为子项提供了实现/修改该方法的机会。
那么为什么所有方法都不能“覆盖”?保护基类开发人员的意图。您将更改基类的行为,您不知道基类开发人员是否希望您这样做。这就像一个安全锁。这就是为什么你有三个单词abstract
,virtual
和override
来将基本类的API意图传达给他们的孩子。
答案 1 :(得分:1)
当您从另一个类派生类并且需要更改基类的方法override
的代码时,您需要使用virtual
。这样,基类的继承方法可以具有不同的行为 - 更适合派生类。
更一般地说,如MSDN中所述:
覆盖修饰符必需 扩展或修改继承方法,属性,索引器或事件的抽象或虚拟实现。