1

私は代わりに行う方法に興味があります:

- (id)init {
    if ((self = [super init])) {
         //initialize subclass objects
    }
    return self;
}

スーパークラス オブジェクトの境界を渡してサブクラスを初期化する

- (id)initWithSuperclass:(Superclass *)superclassObject {
    if ((self = superclass)) {
        //initialize subclass objects
    }
    return self;
}

これは可能ですか?もしそうなら、それは私が避けるべきものですか? 私には臭いコードの匂いがしますが、スーパークラスのすべてのデータフィールドを知らずに、スーパークラスオブジェクトのすべてのデータフィールドをサブクラスの初期化に渡す別の方法はわかりません。

私の考えに従っている/この...臭いコードを解決するのを手伝ってくれる人はいますか?

編集:

わかりましたので、以下にクラス A とクラス B があるとします。

@interface A
    //stuff but we don't know what
end

@implementation A

- (id)init {
    if (self = [super init]) {
         //initialize A "stuff"
    }
    return self;
}

end

@interface B : A  
    @property (nonatomic, retain) UIButton* one;
    - initWithA:(A*)superclassObject;
end

@implementation B

- (id)initWithA:(A*)superclassObject {
    if ((self = superclassObject)) {
        one = [[UIButton alloc] init];
    }
    return self;
}

end

私が探しているこれを行う利点は、クラスAでは、アクセスできるコード/コードではないため、すべてのデータフィールドを知らないことです。ただし、そのクラスを拡張する必要があります。クラス B の新しいデータ値 (上記の例の「UIButton one」など) を導入することで、クラス A のインスタンスをクラス B に変更できるようにしたいと考えています。 A.

4

1 に答える 1