0

我有 3 节课

一个基类:MyBaseClass

这实现了一个方法:

- (void) aSuperMethod {
    [[UtilClass sharedUtil] doThisAndSendAnswerToMe:self]
}

- (void) answerReader:(bla bla)someParams {}

MyBaseClass 的一个子类:MySubClass

这也实现了这些方法:

- (void) anotherMethod {
    [[UtilClass sharedUtil] doThisAndSendAnswerToMe:self]
    [self aSuperMethod];
}

- (void) answerReader:(bla bla)someParams {}

当然还有一个实用程序类:UtilClass

这实现了这种方法:

- (void) doThisAndSendAnswerToMe:(id)listener {
    do some stuff
    [listener answerReader:someAnswerParams];
}

当然,在调试模式下,doThisAndSendAnswerToMe 方法在两次调用中收到的侦听器都是 MySubClass 类的。

根据呼叫来源,我该如何指向 MySubClass 或 MyBaseClass ?

4

2 回答 2

1

你不能。子类的方法实现总是覆盖超类的实现。

一种解决方案是在超类和子类中使用不同的方法名称,并将回调方法的名称传递给 UtilClass。UtilClass 然后使用 -[NSObject performSelector:withObject:] 调用该方法。

-(void)baseClassAnswerReader:(id)someAnswerParams { ... }
[[UtilClass sharedUtil] doSomethingAndSendAnswerToMe:self 
                                            selector:@selector(baseClassAnswerReader:)];

另一种解决方案是将完成块对象传递给 UtilClass。UtilClass 然后在完成后调用块对象。

[[UtilClass sharedUtil] doSomethingWithCompletionBlock:^(id someAnswerParams){ ... }];
于 2013-06-19T21:55:19.610 回答
0

如果要使用基类,则使用基类的实例,如果要使用子类,则使用子类的实例。

如果您不希望子类方法覆盖超类方法,请使其成为不同的方法而不是覆盖。

于 2013-06-19T00:40:43.790 回答