【问题标题】:How to explicitely pass self as a super class to a method and being called back instead of subclass?如何将 self 作为超类显式传递给方法并被回调而不是子类?
【发布时间】:2013-06-18 23:09:49
【问题描述】:

我有 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 ?

【问题讨论】:

  • “取决于呼叫来源”是什么意思?当我第一次阅读本文时,我以为您的意思是取决于对象的类,但这应该已经起作用了,因为方法调用 answerReader: 将根据对象的类进行调度。
  • ...您不想让侦听器接收到运行answerReader: 的调用吗?还是我误会你了?你有行[self.listener answerReader:someAnswerParams];...
  • @gaige:为了更清晰,我做了一些修改。我的意思是“调用来源”是发起调用的方法和类类型。但在这两种情况下,对象的类都是 MySubClass。
  • @David:哎呀,“自我”。是一个错误。为了更清楚,我做了一些编辑。

标签: ios objective-c delegates subclass overloading


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    如果您不希望子类方法覆盖超类方法,则将其设置为不同的方法而不是覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多