类和超类之间的双向通信

时间:2011-09-15 13:42:26

标签: objective-c ios oop

[抱歉我的英语不好]

我有五个特定但类似的类S的常用超类B1B2B3B4B5

我想将'common'(每个B的代码类似)代码放到S,(并通过[super myCommonFunction]调用它)。

应该没问题,但问题是myFunction需要从内部调用 来自B1B2B3B4B5的特定函数(它是相同的类型函数,没有参数,甚至可以在每个),

如何从'superclass'调用self方法?

3 个答案:

答案 0 :(得分:3)

您需要做的就是声明要在超类中调用的方法,如果需要,可以将其保留为空,或者提供默认实现。

然后,您只需在每个子类中提供进一步的实现,覆盖超类方法。

然后当你需要从超类中调用方法时,你只需使用[self myMethod],而是调用正确的子类方法。

答案 1 :(得分:0)

如果我确定后代类中的方法总是具有相同的名称,那么@Tom建议的方法是我将使用的方法。如果名称可以根据任意条件而变化,那么这是另一种非常灵活的方法。您需要更改方法签名以符合您的要求:

typedef id (^common_function_callback_t)(void);

@interface S : ...
    - (id) commonFunctionWithCallback:(common_function_callback_t) callback;
@end

@implementation S
- (id) commonFunctionWithCallback:(common_function_callback_t) callback 
{
    // ...
    id someIntermediateResult = callback();
    // ...
    return someFinalResult;
}
@end

@implementation B1 // Similar for all other B's
- (id) myFunction
{
    id someThing = ...;
    id someStuff = [self commonFunctionWithCallback:^() {
             return someThing;
        }];
    // ...
    return someOtherResult;
}
@end

答案 2 :(得分:-1)

据我了解,您希望从S类调用不同的方法,具体取决于哪个子类称为commonFunction?如果是这样 - 您只需检查self的实例是什么,不要拨打[super commonFunction],而是[self commonFunction]。这将自动调用[super commonFunction],因为self继承自super