Cal*_*one 5 inheritance objective-c
这与目标C有关.我有3个班级.
ClassA,ClassB和ClassC.
ClassB并且ClassC是.的子类ClassA.
@interface ClassB : ClassA
@interface ClassC : ClassA
Run Code Online (Sandbox Code Playgroud)
我需要做的检查classA,不论是否self是ClassB或ClassC.
小智 25
我需要...
不,你没有.如果基类需要有关其子类的知识,那么您就犯了一个巨大的设计错误.
无论如何,这是如何检查是否在特定的子类中:
if ([self isKindOfClass:[ClassB class]]) {
// Class B
} else if ([self isKindOfClass:[ClassC class]]) {
// Class C
}
Run Code Online (Sandbox Code Playgroud)
我需要在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).