前言:子类可以直接继承父类中的方法,而不需要重新编写相同的方法,但有时候子类并不想原封不动的继承父类中的方法,而是希望在子类中实现一些定制功能,这时就可以对父类的方法进行方法重写或方法覆盖。
1、方法重写的规则
一般来说,如果希望在子类中调用父类的某个方法时,实现一些特定的功能,则可以考虑对父类的方法进行重写(当然可以考虑新增一个新的方法,在这个方法中首先调用一下父类的方法,但这样做会增加一些新方法,程序的可读性变差。)当子类需要重写父类的方法时,必须保证重写的两个方法返回值、方法名、参数列表完全一致。
方法的重写在iOS开发中十分常见,例如,当我们新增一个自定义控制器类时,系统会自动添加一些有关控制器的方法,例如viewDidLoad,以便我们对方法进行重写。
2、方法重写的实现
新增一个ClassA,其中有一个printWebSite的方法,调用后会打印一个字符串,如下所示:
#import
@interfaceClassA:NSObject
@property(nonatomic,copy)NSString*webSite;
-(void)printWebSite;
@end
#import "ClassA.h"
@implementationClassA
-(void)setWebSite:(NSString*)webSite{
//给传入的webSite添加http://前缀
_webSite=[NSStringstringWithFormat:@"http://%@",webSite];
}
-(void)printWebSite{
NSLog(@"%@",self.webSite);
}
@end
新建一个ClassB,继承自ClassA,在ClassB中重写printWebSite方法,改变打印的样式,如下所示:
#import "ClassA.h"
@interfaceClassB:ClassA
-(void)printWebSite;
@end
#import "ClassB.h"
@implementationClassB
-(void)printWebSite{
NSLog(@"学习iOS的网址:%@",self.webSite);
}
@end
在main()中分别调用父类和子类的printWebSite方法,如下:
#import
#import "ClassA.h"
#import "ClassB.h"
intmain(intargc,constchar*argv[]){
@autoreleasepool{
ClassA*classA=[[ClassAalloc]init];
classA.webSite=@"www.hcios.com";
[classA printWebSite];
ClassB*classB=[[ClassBalloc]init];
classB.webSite=@"www.hcios.com";
[classB printWebSite];
}
return0;
}
运行结果:
3、子类方法调用父类方法
在实际开发过程中,子类中经常会先调用一下父类的方法,然后在进行一些定制操作,例如在控制器类的viewDidLoad方法中,都需要首先执行[super viewDidLoad],然后再对子类的viewDidLoad方法进行定制。
接着上面的案例,对子类ClassB的printWebSite方法进行一些改进,使其首先调用一下父类的printWebSite方法,代码如下:
#import "ClassB.h"
@implementationClassB
-(void)printWebSite{
[superprintWebSite];//调用父类的方法
NSLog(@"宏创学院网址:%@",self.webSite);
}
@end
运行结果:
网友评论