我正在使用C#和Unity3D。
当我使用Monobehaviour并创建Update方法时,我不需要使用override关键字。
当我创建自己的类并重写函数时,我需要使用override关键字。
为什么?为什么在创建Update方法时我不需要使用override关键字?
我正在使用C#和Unity3D。
当我使用Monobehaviour并创建Update方法时,我不需要使用override关键字。
当我创建自己的类并重写函数时,我需要使用override关键字。
为什么?为什么在创建Update方法时我不需要使用override关键字?
Update
、Start
、Awake
等)方面采取了一些特殊的处理方式。你可以将它们声明为private,即使如此它们也会被调用。除非你使用反射(reflection),否则语言本身无法实现这一点,但我听说它们没有使用反射,所以我不知道它们是如何做到的。但老实说,这并不重要,因为你可以将其视为语言的一���异常情况:如果你实现了这些方法,它们就会被调用。就是这样简单。
至于其他所有情况,你必须遵循语言规范。以下是一个简单的解释:
如果基类中标记了abstract
或virtual
,那么你可以或者必须override
一个方法。
当基类希望其子类实现某个方法时,这个方法就是abstract
的。当基类提供了一个实现方法但也为子类提供了实现/修改该方法的机会时,这个方法就是virtual
的。
那么为什么不能将所有方法都设计成“可重写的”呢?为了保护基类开发者的意图。你会改变基类的行为,而你无法确定基类开发者是否希望你这样做,就像一把安全锁。因此,出现了abstract
、virtual
和override
这三个词,用于传达API意图从基类到其子类。
override
,当你从另一个类派生一个类并且你需要改变基类的一个方法的代码时,这个方法必须是 virtual
。这样,基类继承的方法可以对派生类有不同的行为-更适合派生类。覆盖修饰符是必需的,用于扩展或修改继承方法、属性、索引器或事件的抽象或虚拟实现。