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

时间:2013-04-17 18:09:28

标签: objective-c inheritance

这与目标C有关。我有3个班级。 ClassAClassBClassC

ClassBClassCClassA的子类。

@interface ClassB : ClassA
@interface ClassC : ClassA

我需要在classA进行检查,selfClassB还是ClassC

4 个答案:

答案 0 :(得分:24)

  

我需要......

不,你没有。如果基类需要了解其子类,那么你就会犯巨大的设计错误。


无论如何,这是检查特定子类的方法:

if ([self isKindOfClass:[ClassB class]]) {
    // Class B
} else if ([self isKindOfClass:[ClassC class]]) {
    // Class C
}

答案 1 :(得分:5)

  

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

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

<强> ClassA的:

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

- (void)doSpecializedThing
{
    return;
}

<强> ClassB的:

- (void)doSpecializedThing
{
    // ClassB's specialized version of whatever ClassA needs to do
}

<强> ClassC:

- (void)doSpecializedThing
{
    // ClassC's specialized version of whatever ClassA needs to do
}

这可以防止ClassA必须知道有关其子类的任何特定内容,因为这几乎总是一个坏主意。

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

答案 2 :(得分:2)

if([self isKindOfClass:[ClassB class]]){
     ...
}
else if ([self isKindOfClass:[ClassC class]])
{

}

希望这会有所帮助......

正如H2CO3所说,将子类特定的行为带入子类本身。

答案 3 :(得分:-1)

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

//不要使用这个类。请改用子类 ASSERT([NSStringFromClass([self class])isEqualToString:@“SDDocumentsViewController”] == NO);