这是在 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);