假设一个类Vehicle有一个叫做“StartEngine”的方法,在我的子类叫做“Airplane”中我想覆盖“StartEngine”。如果我使用C#,我应该使用Airplane的StartEngine方法声明/定义中的“override”关键字。
我问的原因是,如果不是“StartEngine”我输入“startengine”,C#会抱怨,但是由于该关键字,Objective-C不会。
答案 0 :(得分:15)
Objective-C中的所有类和实例方法都是动态调度的,可以在子类中重写。没有类似C#的override
关键字,或类似virtual
关键字。
答案 1 :(得分:11)
以下是飞机的startEngine方法的样子:
- (void)startEngine
{
// custom code
// call through to parent class implementation, if you want
[super startEngine];
}
答案 2 :(得分:2)
Objective-C中的所有方法都是可重写的,您只需为相同的签名编写一个方法。
答案 3 :(得分:0)
到目前为止,所有答案都缺少问题的实际要点。不是“我可以覆盖方法”,而是“我可以让编译器告诉我什么时候我认为是覆盖的东西实际上是不覆盖任何东西的。”
可悲的是,问题的答案是否定的。在撰写本文时,ObjC没有任何方法可以对方法进行注释,因为它是对基类方法的显式覆盖。
由于动态调度,不可能完全等同于C#,C ++和Java。动态分派意味着基本上所有对象都响应所有消息,只是有时响应是引发异常。可以在运行时动态更改任何特定消息的响应方式。因此,编译器无法在编译时100%地告诉您任何特定方法在运行时是否具有非默认处理程序。
现在,我从未编写过ObjC编译器,但是从理论上讲,我相信编译器可以检查您声明的方法,以替代 static 声明的方法所有基类中的签名。这就是绝大多数ObjC代码的编写方式,其中方法签名显式地静态写入@interface声明中。因此,您可能会有一个类似于NS_INTERFACE_OVERRIDE的注释,该注释要求当前类的某些基类在其@interface部分中显式声明的签名相同。