这是在 Objective C 的上下文中。我有 3 个类。
ClassA,ClassB和ClassC.
ClassB并且ClassC是 的子类ClassA。
@interface ClassB : ClassA
@interface ClassC : ClassA
我需要办理登机手续classA,无论self是 aClassB还是ClassC。
这是在 Objective C 的上下文中。我有 3 个类。
ClassA,ClassB和ClassC.
ClassB并且ClassC是 的子类ClassA。
@interface ClassB : ClassA
@interface ClassC : ClassA
我需要办理登机手续classA,无论self是 aClassB还是ClassC。
我需要...
不,你没有。如果基类需要有关其子类的知识,那么您就犯了一个巨大的设计错误。
无论如何,这是检查是否在特定子类中的方法:
if ([self isKindOfClass:[ClassB class]]) {
// Class B
} else if ([self isKindOfClass:[ClassC class]]) {
// Class C
}
我需要检查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)。
if([self isKindOfClass:[ClassB class]]){
...
}
else if ([self isKindOfClass:[ClassC class]])
{
}
希望这可以帮助...
正如 H2CO3 所说,将子类特定的行为带入子类本身。
我在一个字符串中的解决方案是:
//不要使用这个类。使用子类代替 ASSERT([NSStringFromClass([self class]) isEqualToString:@"SDDocumentsViewController"]==NO);