私がこの問題に対処する主な方法は、実際に読んでいた 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されていない子クラスであることを意味します。
これがあなたの悩みの解決に役立つことを願っています。また、なぜ継承が重要なのか、なぜ継承を使用すべきなのかを理解するのに役立つことを願っています!