如何禁止继承init方法?

时间:2013-12-07 23:16:50

标签: ios iphone objective-c

我一直在努力寻找正确而明确的答案,所以我决定在这里问一下。

我创建了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方法。有没有办法实现这个目标?

提前致谢。

3 个答案:

答案 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)

好的,我找到了问题的答案,我应该使用类别。 但感谢所有参与的人。