这与目标C有关。我有3个班级。
ClassA
,ClassB
和ClassC
。
ClassB
和ClassC
是ClassA
的子类。
@interface ClassB : ClassA
@interface ClassC : ClassA
我需要在classA
进行检查,self
是ClassB
还是ClassC
。
答案 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);