关于面向对象中的继承问题其实不难理解
当我们的代码中的不同类出现大量相同的属性和方法的时候,我们就可以用继承来减少重复代码的使用,这样可以大大提高代码的效率,也可以方便后期代码的维护。
首先,继承需要有子类和父类,通常OC中的父类是NSObject,但是在某些时候,当我们的类需要继承某些属性和功能的时候,我们就可以自己设置该父类。下面用一个具体的实例说明。
例如,现在有狗和猫两个类,他们同时具有姓名和体重两个属性,以及具有跑这个方法,此时如果单独实现必然要在两个不同的类里面分别写出各自的属性和方法,但是这样就造成了代码的重复,因此我们可以考虑狗和猫可以同时继承同一个类的
属性和方法,例如将该类命名为动物。
animal的接口文件:
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
int _weight;
NSString *_name;
}
-(void) setWeight : (int) weight;
-(int) weight;
-(void) setName : (NSString *) name;
-(void) run;
animal的接口文件的实现:
#import "Animal.h"
@implementation Animal
-(void) setWeight : (int) weight
{
_weight = weight;
}
-(int) weight
{
return _weight;
}
-(void) setName : (NSString *) name
{
_name = name;
}
-(void) run
{
NSLog(@"%@跑起来了",_name);
}
@end
而此时狗和猫两个类就可以直接继承animal的属性和方法
dog.h文件:
#import <Foundation/Foundation.h>
//在头文件中导入animal类
#import "Animal.h"
//将继承对象改为 animal
@interface Dog : Animal
@end
cat.h文件:
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Cat: Animal
@end
此时二者接口实现中不用再写
main.m文件
#import <Foundation/Foundation.h>
#import "Animal.h"
#include "Cat.h"
#include "Dog.h"
int main()
{
Cat *cat =[Cat new];
[cat setWeight:2];
[cat setName:@"阿飞"];
[cat run];
Dog *dog =[Dog new];
[dog setWeight:8];
[dog setName:@"阿旺"];
[dog run]
return 0;
}
另外,子类的方法可以重写,此时不再继承父类方法。但是同一属性只能是自己的或继承父类的,而不能同时存在。
super关键字
1. 作用:既可以重写,又能调用超类的实现方式。
2. 语法:[super setNumber:number]
3. 注意:super关键字在对象方法中就调用对象方法,类方法中就调用类方法
4. 使用场合:子类重写父类的方法又想保留父类的行为。