Ios 如何明确地将self作为一个超类传递给一个方法,并被回调而不是子类?

Ios 如何明确地将self作为一个超类传递给一个方法,并被回调而不是子类?,ios,objective-c,delegates,subclass,overloading,Ios,Objective C,Delegates,Subclass,Overloading,我有三节课 一个基类:MyBaseClass 它实现了一种方法: - (void) aSuperMethod { [[UtilClass sharedUtil] doThisAndSendAnswerToMe:self] } - (void) answerReader:(bla bla)someParams {} MyBaseClass的一个子类:MySubClass 这也实现了这些类型的方法: - (void) anotherMethod { [[UtilClass sha

我有三节课

一个基类:
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?

如果要使用基类,请使用基类的实例;如果要使用子类,请使用子类的实例


如果您不希望子类方法重写超类方法,请将其改为其他方法,而不是重写。

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

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

-(void)baseClassAnswerReader:(id)someAnswerParams { ... }
[[UtilClass sharedUtil] doSomethingAndSendAnswerToMe:self 
                                            selector:@selector(baseClassAnswerReader:)];
另一种解决方案是将完成块对象传递给UtilClass。UtilClass然后在完成时调用块对象

[[UtilClass sharedUtil] doSomethingWithCompletionBlock:^(id someAnswerParams){ ... }];

“取决于呼叫来源”是什么意思?当我第一次读到这篇文章时,我认为您的意思是取决于对象的类,但这应该已经起作用了,因为方法调用
answerReader:
将根据对象的类进行调度……您不希望侦听器接收调用以运行
answerReader:
?还是我误解了你?您有一行
[self.listener answerReader:someAnswerParams]
…@gaige:我做了一些编辑,以便更清楚。我的意思是“调用来源”,即调用从何处开始的方法和类类型。但在这两种情况下,对象的类都是MySubClass。@David:oops,“self.”是个错误。我做了一些编辑以便更清楚。