我有两个类:BatchDownloader,SpeechDownlader
BatchDownloader是基类,并SpeechDownloader继承它.
在BatchDownloader,每当下载一个文件时,-(void)downloadComplete:task将被调用.
但在SpeechDownloader,我也想发布通知downloadComplete:task.
我可以在实现中编写具有相同名称的方法SpeechDownloader吗?还是有更好的方法?
谢谢.
ps我不想-(void)downloadComplete:task公开,因为它应该只能自己调用.
Gre*_*reg 13
如果在子类中实现与超类中的私有方法同名的方法,则将在子类的实例上调用子类方法.
即,如果你像这样在你的超类中实现一个方法,而不是在任何地方声明它:
@implementation classA
- (void)doSomething {
NSLog("a");
}
Run Code Online (Sandbox Code Playgroud)
然后,在子类实现中,实现一个具有相同名称的方法:
@implementation subclassOfA
- (void)doSomething {
NSLog("b");
}
Run Code Online (Sandbox Code Playgroud)
当您调用doSomething子类的实例时,将调用子类实现而不是超类实现,因此此示例中的代码将导致"b"被打印到控制台.
但是,如果您还想访问该方法的超类实现,则可以使用:
- (void)doSomething {
[super doSomething];
NSLog("b");
}
Run Code Online (Sandbox Code Playgroud)
这也将调用超类实现.如果您遇到编译错误(由于该方法是私有的而super不是实现它),您可以使用它[super performSelector:@selector(doSomething)]来完成相同的操作.
这是因为Objective-C运行时查找方法调用的方式.由于这些方法具有完全相同的方法签名(相同名称,返回类型和参数[none]),因此它们被认为是相等的,并且运行时总是在查看超类之前检查对象的类,因此它将找到子类方法实现第一.
此外,这意味着您可以这样做:
classA *test = [subclassOfA new];
[test doSomething];
Run Code Online (Sandbox Code Playgroud)
而且,令人惊讶的是,控制台将打印" b "(如果您也调用了实现,则为" ab " super).