5

这是在 Objective C 的上下文中。我有 3 个类。 ClassA,ClassBClassC.

ClassB并且ClassC是 的子类ClassA

@interface ClassB : ClassA
@interface ClassC : ClassA

我需要办理登机手续classA,无论self是 aClassB还是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

我需要检查classA,无论self是ClassB还是ClassC。

一个更好的方法是调用一些可以在子类中定义的抽象方法:

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]在其实现中调用。但是,这不一定在每种情况下都是正确的解决方案,例如当 ClassA 中的代码-doThing依赖于子类中的某些行为时(例如,如果-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 回答
0

我在一个字符串中的解决方案是:

//不要使用这个类。使用子类代替 ASSERT([NSStringFromClass([self class]) isEqualToString:@"SDDocumentsViewController"]==NO);

于 2014-09-20T03:24:03.197 回答