0

制限されたオブジェクトがすべてスーパークラスから継承されている場合、配列に入れるオブジェクトのタイプを制限するにはどうすればよいですか?

たとえば、私はと呼ばれる親クラスを持っています

parentObj

次に、スーパークラス (parentObj) に追加され、使用できないパラメーターを持つ 3 つの子クラスがあります。

childClass1
childClass2
childClass3

次に、関連していない他のクラスがいくつかありますが、構築しようとしている配列から離れたいです

otherClass1
otherClass2

私はこの可変配列を持っています

NSMutableArray *arrayOfChildren;

主にparentObjの3つの子クラスで構成され、otherClassesを含めることができないようにしたい

子クラスごとに配列に対して子クラスを読み書きするための別のメソッドを作成したくありません。作成する子クラスがさらに多くなる可能性があるためです。

これらのクラスを配列に追加する 1 つのメソッドと、子の追加されたパラメーターを含むそれらを読み取るメソッドを 1 つ持つにはどうすればよいですか?

4

2 に答える 2

0

私がこの問題に対処する主な方法は、実際に読んでいた PHP の本で教えられました。明らかに、PHP は Objective C ほど厳密ではないため、いくつか変更を加える必要がありました。

これは、特にゲーム プログラマーにとって、配列が何百ものオブジェクトを運ぶ必要があり、すべてが特定の型に制限されている場合に、その方法を知るのに非常に役立つスキルだと思います。

継承の良い点は、子クラスも親/祖父母クラスの「型」を引き継ぐことです (クラスのツリーが長い場合は、上に行くことができます)。

たとえば、parentObj 型のパラメーターを持つメソッドがある場合、そのパラメーター スロットに任意の子を配置すると、コードが実行されます。

- (BOOL) addObjectToArray: (parentObj *) obj {
    [array addObjectToArray:obj];
    return true;
}

BOOL worked = [self addObjectToArray:childClass1];
[self addObjectToArray:childClass2];
[self addObjectToArray:childClass3];
[self addObjectToArray:otherClass1];

コードは最後の行まで実行され、適切に動作しません。otherClass1 は parentObj 型ではないため、機能しません。これにより、配列が保持できるクラスのタイプを 1 つの簡単なメソッドで制限することができました。

次に取り組むべきステップは、オブジェクトからパラメータを読み取ることです。他にももっと簡単な方法があると思いますが、私はこのようにしています。

子クラスのいわゆる ID を保持するスーパー クラス (整数) にパラメーターを配置します。

parentObj.h:
//...
- (id) initWithProperties...:() :() :()... andID: (int)idType;
@property(nonatomic) int type;
//...

parentObj.m:
//...
- (id) initWithProperties...:() :() :()... andID: (int)idType {
    //...
    self.type = idType;
    //...
}
//...

childClass1.h:
//...
@property(nonatomic) int someOtherPropertyOfChild1;
//...

childClass1.m:
//...
- (id) init {
    self = [super initWithProperties... ...andID:1];
    if (self) {
    }
    return self;
}
//...

childClass2.h:
//...
@property(nonatomic) int someOtherPropertyOfChild2;
//...

childClass2.m:
//...
- (id) init {
    self = [super initWithProperties... ...andID:2];
    if (self) {
    }
    return self;
}
//...

等...

どの ID がどの子クラスに関連付けられているかを覚えておく必要があります。そうしないと、エラーが発生する可能性があります。

ここで、クラスでいっぱいの配列内のすべてのオブジェクトを循環する for ループがあるとします。そして、各子クラスで追加のパラメーターを出力する必要があるとしたら、どうすればよいでしょうか? 方法をお見せします。

for ループで反復される変数が x であると仮定しましょう。

switch([array objectAtIndex:x].type) {
    case 1:
        //remember that childClass1 is id of one
        childClass1 *CC1 = [array objectAtIndex:x];
        NSLog(@"%d", CC1.someOtherPropertyOfChild1);
        break;
//...

デフォルトのケースが呼び出された場合、それは配列から取得しているオブジェクトがparentObjオブジェクト、または正しくIDされていない子クラスであることを意味します。

これがあなたの悩みの解決に役立つことを願っています。また、なぜ継承が重要なのか、なぜ継承を使用すべきなのかを理解するのに役立つことを願っています!

于 2013-07-03T06:06:04.113 に答える