在Objective-C中实现一个纯粹的虚拟方法
我想去那里。 不过,严肃地说,如何以“苹果”的方式来实现一个纯粹的虚拟方法呢? 你在你的基类中使用协议,并在这些方法上抛出exception?
当你在Objective-C中编程时,你需要清除虚拟方法之类的东西。 您不要在Objective-C对象上调用方法,而是向它们发送消息。 对象既可以响应消息,也可以不响应消息,但是由于dynamic绑定,所以直到运行时间才能知道。
因此,你可以在一个基础对象上声明一个方法,而不是提供一个实现,没有问题(编译器警告除外),但是当你用这样的方法直接实例化一个对象时,你不能让编译器标记出来,在运行时抛出一个错误,除非你真的把这个消息发送给对象。
创build“虚拟”基类(在我看来)的最好方法是声明该方法,并给它一个存根实现,抛出一个合适的exception。
在Objective-C中,没有像C ++那样的纯虚拟支持。
模拟将是你在你的界面声明一个方法,但是不要在你的.m文件中实现它。 当然,你会得到编译器警告,但是IIRC你可以closures它们。 但是如果你不用C ++(IIRC)获得的子类覆盖它们,你将不会得到警告/错误。
另一种方法是用NSAssert(NO, @"Subclasses need to overwrite this method");
来实现它们NSAssert(NO, @"Subclasses need to overwrite this method");
身体。 不过,你只能在运行时捕获这个,而不是编译时。
根据你在做什么,委托模式可能比一个子类更合适,其中委托被定义为id<YourDelegateProtocol>
。 如果代理协议中的所需方法未实现,则编译器将生成警告。
在Objective-C中通常避免使用子类化,因为对象不能从多个超类inheritance,但可以实现多个协议。
你应该使用:
- (void)doesNotRecognizeSelector:(SEL)aSelector method.
正如苹果指出的,在这里: https : //developer.apple.com/library/mac/#documentation/cocoa/reference/Foundation/Classes/NSObject_Class/Reference/Reference.html
你有几个select,但你在正确的轨道上。
ObjC不直接支持这个,迫使子类实现一个协议是在编译时检查它的最好方法。
在基类中实现方法的“秘密”和断言是我确认子类在运行时已正确子类化的方法。 有些人对断言有不同的看法,或者必须保持主动,所以这并不总是一个好的解决办法。
您也可以强制子类使用特定的类构造函数和初始化序列,然后在返回实例之前validation它们是否已经实现了所需的所有内容,以防编译器警告不切断它。
但是ObjC缺less一些允许客户在脚下自拍的langfunction,或者他们希望的解决方法,所以你不应该太执着。
注意:在ObjC中exception是非常罕见的(也有点不安全)。
虚拟方法是一种方法,其行为可以通过具有相同签名的函数(即具有相同数量的参数和参数types的相同名称)在inheritance类中被覆盖。
例:-
@implementation BaseClass -(void)viewDidLoad { [self virtualMethod:123]; } -(void)virtualMethod:(int)param { //implement this method in subclass } @end
////////////////////////////////////////////////// //
@interface ChildClass:BaseClass @end @implementation ChildClass -(void)virtualMethod:(int)param { NSLog(@"There is no keyword "Virtual" in Objective C."); } @end
输出: –
目标C中没有关键字“虚拟”。