Objective-C检查self是否也是子类

Cal*_*one 5 inheritance objective-c

这与目标C有关.我有3个班级. ClassA,ClassBClassC.

ClassB并且ClassC是.的子类ClassA.

@interface ClassB : ClassA
@interface ClassC : ClassA
Run Code Online (Sandbox Code Playgroud)

我需要做的检查classA,不论是否selfClassBClassC.

小智 25

我需要...

不,你没有.如果基类需要有关其子类的知识,那么您就犯了一个巨大的设计错误.


无论如何,这是如何检查是否在特定的子类中:

if ([self isKindOfClass:[ClassB class]]) {
    // Class B
} else if ([self isKindOfClass:[ClassC class]]) {
    // Class C
}
Run Code Online (Sandbox Code Playgroud)

  • 上面的位是非常正确的.子类特定的行为应该进入子类.子类总是可以在重写方法中调用super. (4认同)
  • 这完全是我的怀疑.如果ClassB和ClassC不是子类,则此解决方案有效.如果我必须在基类中导入它们,那就违背了继承的目的.+1清除我的怀疑. (3认同)

Cal*_*leb 5

我需要在classA中进行检查,无论self是ClassB还是ClassC.

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

ClassA的:

- (void)doThing
{
    [self doSpecializedThing];
}

- (void)doSpecializedThing
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

ClassB的:

- (void)doSpecializedThing
{
    // ClassB's specialized version of whatever ClassA needs to do
}
Run Code Online (Sandbox Code Playgroud)

ClassC:

- (void)doSpecializedThing
{
    // ClassC's specialized version of whatever ClassA needs to do
}
Run Code Online (Sandbox Code Playgroud)

这可以防止ClassA必须知道关于其子类的任何具体内容,因为这几乎总是一个坏主意.

您还可以-doThing在ClassB和ClassC中覆盖它们并[super doThing]在它们的实现中调用它们.但是,在所有情况下,这并不一定是正确的解决方案,例如ClassA中的代码-doThing依赖于子类中的某些行为(例如,如果-doSpecializedThing要返回使用的值-doThing).