我想去那里。但说真的,如何以“Apple”方式实现纯虚方法?您是否使用基类的协议并在这些方法上抛出异常?
答案 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.
答案 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中没有关键字”虚拟“。