これは、Objective C のコンテキストにあります。3 つのクラスがあります。
ClassA
、ClassB
およびClassC
。
ClassB
とClassC
のサブクラスですClassA
。
@interface ClassB : ClassA
@interface ClassC : ClassA
classA
かどうかに関係なく、チェックインする必要がself
ありClassB
ますClassC
。
これは、Objective C のコンテキストにあります。3 つのクラスがあります。
ClassA
、ClassB
およびClassC
。
ClassB
とClassC
のサブクラスですClassA
。
@interface ClassB : ClassA
@interface ClassC : ClassA
classA
かどうかに関係なく、チェックインする必要がself
ありClassB
ますClassC
。
する必要がある...
いいえ、あなたはしません。基本クラスがそのサブクラスに関する知識を必要とする場合、大きな設計ミスを犯しています。
とにかく、これは特定のサブクラスにあるかどうかを確認する方法です:
if ([self isKindOfClass:[ClassB class]]) {
// Class B
} else if ([self isKindOfClass:[ClassC class]]) {
// Class C
}
self が ClassB または ClassC であるかどうかにかかわらず、classA でチェックを行う必要があります。
これを行うより良い方法は、サブクラスで定義できる抽象メソッドを呼び出すことです。
クラスA:
- (void)doThing
{
[self doSpecializedThing];
}
- (void)doSpecializedThing
{
return;
}
クラスB:
- (void)doSpecializedThing
{
// ClassB's specialized version of whatever ClassA needs to do
}
クラスC:
- (void)doSpecializedThing
{
// ClassC's specialized version of whatever ClassA needs to do
}
これにより、ClassA がそのサブクラスに関する特定の情報を知る必要がなくなります。これはほとんど常に悪い考えです。
-doThing
ClassB と ClassC でオーバーライドして、実装で呼び出すこともできます[super doThing]
。-doThing
ただし、ClassA のコードがサブクラスの動作に依存している場合 (たとえば、-doSpecializedThing
で使用される値を返す場合) など、すべての場合に正しい解決策であるとは限りません-doThing
。
if([self isKindOfClass:[ClassB class]]){
...
}
else if ([self isKindOfClass:[ClassC class]])
{
}
お役に立てれば...
H2CO3 が言ったように、そのサブクラス固有の動作をサブクラス自体に持ち込みます。