继承是oc中比较常见的。
1、继承:
就是当两个类拥有相同的属性和方法时,就可以将相同的东西抽取到一个父类中。子类可以拥有父类中所有的成员变量和方法。
2、继承的好处:
可以抽取重复代码,节省时间。建立了类之间的关系。
3、使用注意:
父类必须写在子类前面
子类不能拥有和父类相同的名称的成员变量
当调用某个方法时,优先去当前类中找,如果找不到,再去父类中找。
4、组合
@interface Score : NSObject
{
int _oScore;
int _ocScore;
}
@end
// 实现
@implementation Score
@end
@interface Student : NSObject
{
// 组合 A*_a;
Score * _score;
int _age;
}
@end
5、super
1>直接调用父类中的某个方法
2>super处在对象中,那么就会调用父类的对象方法
super处在类方法中,那么就会调用父类的类方法
3>使用场合:子类重写父类方法时想保留父类的一些行为
举例说明:
// 设置一个类为A 声明并且实现
@interface A : NSObject
- (void)speak;
@end
@implementation A
- (void)speak
{
NSLog(@"这里是A");
}
@end
//B继承A
@interface B : A
@end
@implementation B
// 重写。并使用父类的行为
- (void)speak
{
NSLog(@"这里是B");
// 这里使用super代表着指向的是A里面的speak
[super speak]
}
@end
6、多态
字面上理解就是多种状态,有继承才有多态
代码的体现:父类类型的指针指向子类的对象
好处:如果函数、方法中的参数使用的是父类类型可以传入父类、子类对象
局限性:父类类型的变量不能直接调用子类特有的方法,如果要使用,必须强转为子类类型的变量后,才能直接调用子类特有的方法。
@interface Animal : NSObject
- (void)eat
@end
@implementation Animal
- (void)eat
{
NSLog(@"动物吃东西")
}
@end
// 子类:继承动物
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog(@"gou吃东西")
}
@end
在函数中调用
int main()
{
// 定义一个Dog类型的指针指向dog对象
Dog *d = [Dog new];
// 父类指针指向子类对象
Animal *a = [Dog new];
// 看似animal实际是dog 所以会去dog类型里面找eat
// 调用方法时会检测对象的真实形参
[a eat]
// NSObject *n = [Dog new];
// NSObject *n1 = [Animal new];
return 0;
}