0

我需要在超类中强制初始化 ivar,但是如果没有要初始化的子类中的其他数据,通常无法初始化 ivar。我想到的两个解决方案是:

  1. 将 ivar 所需的生成密钥传递给超类的 init 方法
  2. 从子类的 init 方法调用第二个超类方法

这是示例(人为的,非工作的)代码。stringBasedOnSubclassKey ivar 应该从子类的 key 方法初始化为 NSString。

@interface MySuperclass : NSObject
    @property (nonatomic, readonly) NSString *stringBasedOnSubclassKey;
@end

@interface MySubclass : MySuperclass
    @property (nonatomic, assign, readonly) int value;
@end

@implementation MySubclass

- (instancetype)init
{
    if (self = [super init]) {
        _value = 30;
    }
    return self;
}

- (NSString *)key
{
    return [NSString stringWithFormat:@"UniqueKey-%d", self.value];
}

所以问题是有没有办法使用“key”方法的返回值来强制初始化 stringBasedOnSubclassKey ivar?我不相信我可以执行上面的解决方案 1 和 2。这些子类也可能由其他外部开发人员创建,因此关键方法可能比这更复杂。

更新:我正在处理这个基类的现有子类,因此限制对现有子类的更改的解决方案是一个因素。

4

1 回答 1

1

stringBasedOnSubclassKey以强制初始化它的方式编写 getter :

- (NSString *) stringBasedOnSubclassKey {
    if !(_stringBasedOnSubclassKey) {
        _stringBasedOnSubclassKey = // whatever;
    }
    return _stringBasedOnSubclassKey;
}

并编写超类key方法抛出异常,从而强制客户端在子类中重写。

于 2013-05-04T14:53:30.930 回答