5

我有两个班:BatchDownloaderSpeechDownlader

BatchDownloader是基类,并SpeechDownloader继承了它。

BatchDownloader中,每当下载一个文件时,-(void)downloadComplete:task都会调用。

但是在SpeechDownloader,我也想在中发布通知downloadComplete:task

我可以在实现中只写同名的方法SpeechDownloader吗?还是有更好的方法?

谢谢。

ps 我不想-(void)downloadComplete:task公开,因为它应该只被它自己调用。

4

2 回答 2

13

如果您在子类中实现与超类中的私有方法同名的方法,则您的子类方法在子类的实例上调用。

即,如果您像这样在超类中实现一个方法,而没有在任何地方声明它:

@implementation classA

- (void)doSomething {
    NSLog("a");
}

然后,在您的子类实现中,实现一个具有相同名称的方法:

@implementation subclassOfA

- (void)doSomething {
    NSLog("b");
}

当您调用doSomething子类的实例时,调用子类实现而不是超类实现,因此此示例中的代码将导致“b”打印到控制台。

但是,如果您还想访问该方法的超类实现,则可以使用:

- (void)doSomething {
    [super doSomething];
    NSLog("b");
}

这也将调用超类实现。如果你得到一个编译错误(由于方法是私有的并且super似乎没有实现它),你可以使用它[super performSelector:@selector(doSomething)]来做完全相同的事情。

这是因为 Objective-C 运行时查找方法调用的方式。由于这些方法具有完全相同的方法签名(相同的名称、返回类型和参数 [none]),因此它们被认为是相等的,并且运行时总是在查看超类之前检查对象的类,因此它会找到子类的方法实现第一的。

此外,这意味着您可以这样做:

classA *test = [subclassOfA new];
[test doSomething];

而且,令人惊讶的是,控制台将打印“ b ”(如果您也调用了实现,则为“ absuper ” )。

于 2013-06-04T09:11:30.280 回答
1

如果您使用相同的方法签名实现该方法,它将被称为相信您的实现,无论是否公开。

于 2013-06-04T09:17:14.887 回答