5

これは、Objective C のコンテキストにあります。3 つのクラスがあります。 ClassAClassBおよびClassC

ClassBClassCのサブクラスですClassA

@interface ClassB : ClassA
@interface ClassC : ClassA

classAかどうかに関係なく、チェックインする必要がselfありClassBますClassC

4

4 に答える 4

26

する必要がある...

いいえ、あなたはしません。基本クラスがそのサブクラスに関する知識を必要とする場合、大きな設計ミスを犯しています。


とにかく、これは特定のサブクラスにあるかどうかを確認する方法です:

if ([self isKindOfClass:[ClassB class]]) {
    // Class B
} else if ([self isKindOfClass:[ClassC class]]) {
    // Class C
}
于 2013-04-17T18:12:21.373 に答える
5

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 がそのサブクラスに関する特定の情報を知る必要がなくなります。これはほとんど常に悪い考えです。

-doThingClassB と ClassC でオーバーライドして、実装で呼び出すこともできます[super doThing]-doThingただし、ClassA のコードがサブクラスの動作に依存している場合 (たとえば、-doSpecializedThingで使用される値を返す場合) など、すべての場合に正しい解決策であるとは限りません-doThing

于 2013-04-17T18:16:39.393 に答える
2
if([self isKindOfClass:[ClassB class]]){
     ...
}
else if ([self isKindOfClass:[ClassC class]])
{

}

お役に立てれば...

H2CO3 が言ったように、そのサブクラス固有の動作をサブクラス自体に持ち込みます。

于 2013-04-17T18:13:19.347 に答える