0

スーパークラスでivarの初期化を強制する必要がありますが、そのivarは通常、サブクラスの他のデータを初期化しないと初期化できません。私が考えた2つの解決策は次のとおりです。

  1. ivar に必要な生成キーをスーパークラスの init メソッドに渡します
  2. サブクラスの init メソッドから 2 番目のスーパークラス メソッドを呼び出す

以下は (不自然な、機能しない) コードの例です。stringBasedOnSubclassKey ivar は、サブクラスのキー メソッドから 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];
}

問題は、「キー」メソッドの戻り値を使用して、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 に答える