我一直在努力寻找正确而明确的答案,所以我决定在这里问一下。
我创建了A类并在那里定义了init方法:
@interface A : NSObject
- (id)initWithHealth:(int)hp;
@end
然后我创建了B类,它继承自A类并在那里定义另一个init方法:
@interface B : A
- (id)initWithHealth:(int)hp andDamage:(int)dmg;
@end
主要是,当我要从B类实例化一个对象时,我会建议Xcode使用 - (id)initWithHealth:(int)hp; 或 - (id)initWithHealth:(int)hp andDamage:(int)dmg; init方法。 我如何禁止B类从A类继承init方法?我希望我的B类只有一个我定义的init方法。有没有办法实现这个目标?
提前致谢。
答案 0 :(得分:3)
您有几个选择:
选项1 - 使用旧的init
方法提供默认的“损坏”。在课程B
中,您可以添加:
- (id)initWithHealth:(int)hp {
return [self initWithHealth:hp andDamage:0]; // use an appropriate default
}
- (id)initWithHealth:(int)hp andDamage:(int)dmg {
self = [super initWithHealth:hp];
if (self) {
// do stuff with dmg
return self;
}
选项2 - 如果使用旧的init
方法,则会导致运行时错误。在课程B
中,您可以添加:
- (id)initWithHealth:(int)hp {
NSAssert(0, @"Dont use this");
return nil; // make compiler happy
}
我个人认为选项1是更好的选择。
答案 1 :(得分:0)
在子类B
中,您可以显式定义方法,以便类在运行时不会响应它。
- (instancetype) initWithHealth:(int) hp {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
这是非常传统的,我已经看到它用于很多开源项目和我的一些客户项目。我想当你想确保永远不会调用继承的方法时,这比@ rmaddy的解决方案更可取。如果在调用继承的init方法时需要一个合理的默认值,那么其他代码就可以正常工作。
答案 2 :(得分:0)
已编辑(感谢Sulthan和rmaddy)
好的,我找到了问题的答案,我应该使用类别。 但感谢所有参与的人。