在Objective-C中实现纯虚方法

时间:2011-03-07 16:20:00

标签: objective-c methods pure-virtual

我想去那里。但说真的,如何以“Apple”方式实现纯虚方法?您是否使用基类的协议并在这些方法上抛出异常?

6 个答案:

答案 0 :(得分:55)

当您在Objective-C中编程时,您需要清除虚拟方法等内容。您不会在Objective-C对象上调用方法,而是向它们发送消息。对象要么响应消息要么不响应消息,但是由于动态绑定,你不能在运行时告诉它。

因此,您可以在基础对象上声明一个方法,而不是不提供实现,没有问题(编译器警告除外),但是当您使用这些方法直接实例化对象时,不能让编译器标记出来并且它不会在运行时抛出错误,除非您实际将该消息发送到对象。

创建“虚拟”基类(在我看来)的最佳方法是声明方法并为其提供一个抛出适当异常的存根实现。

答案 1 :(得分:32)

在Objective-C中,没有像C ++那样的纯虚拟支持。

模拟将是您在界面中声明一个方法但不在.m文件中实现它。当然你会得到编译器警告但是IIRC可以关闭它们。但是如果你没有在C ++(IIRC)中得到的子类中覆盖它们,你将不会收到警告/错误。

另一种方法是仅使用NSAssert(NO, @"Subclasses need to overwrite this method");正文来实现它们。但是,你只能在运行时捕获它,而不是编译时。

答案 2 :(得分:7)

根据您正在执行的操作,委托模式可能比子类更合适,其中委托定义为id<YourDelegateProtocol>。如果未实现委托协议中的所需方法,编译器将生成警告。

在Objective-C中通常避免使用子类,因为对象不能从多个超类继承,但它们可以实现多个协议。

答案 3 :(得分:6)

你应该使用:

- (void)doesNotRecognizeSelector:(SEL)aSelector method. 

如Apple所述,此处:https://developer.apple.com/library/mac/#documentation/cocoa/reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

答案 4 :(得分:2)

你有几个选择,但是你走在正确的轨道上。

ObjC不直接支持这一点,强制子类实现协议是在编译时检查它的最佳方法。

'秘密'在基类中实现方法并断言是我做的,以确认子类在运行时已正确子类化。有些人对断言感到复杂,或者必须让他们保持活跃,所以这并不总是一个好的解决方案。

您还可以强制子类使用特定的类构造函数和初始化序列,然后验证它们在返回实例之前已经实现了所需的所有内容,以防编译器警告没有删除它。

但是ObjC缺少一些lang功能,允许客户自己射击,或者解决他们想要的事情......所以你不应该太强调执行它。

注意:ObjC中的异常非常罕见(也有点不安全)。

答案 5 :(得分:0)

虚方法是一种方法,其行为可以在具有相同签名的函数(即具有相同数量的参数和params类型的相同名称)的继承类中重写。

示例: -

@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中没有关键字”虚拟“。