1. 继承
1.1 继承的专业术语
父类/超类 superclass
子类 subclass/subclasses
1.2 继承的使用场合
1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类
继承:xx 是 xxx
组合:xxx 拥有 xxx
A
{
int _age;
int _no;
}
B : A
{
int _weight;
}
// 继承:xx 是 xxx
// 组合:xxx 拥有 xxx
2.组合
A
{
int _age;
int _no;
}
B
{
A *_a;
int _weight;
}
1.3 继承的优点和缺点
继承的好处:
1> 抽取重复代码
2> 建立了类之间的关系
3> 不改变原来模型的基础上,扩充方法
继承的缺点:
耦合性强
1.4 注意点
1> 父类必须声明在子类的前面2> 子类不能拥有和父类相同的成员变量
3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找
4>单继承
1.5 重写
子类重新实现父类中的某个方法,覆盖父类以前的做法
2. super关键字
super的作用
1.直接调用父类中的某个方法
2.super处在对象方法中,那么就会调用父类的对象方法
super处在类方法中,那么就会调用父类的类方法
使用场合:子类重写父类的方法时想保留父类的一些行为
3.多态
3.1 多态的基本概念
没有继承就没有多态
某一个事物的多种形态
OC对象具有多态性
3.2 多态的体现
Person *p = [Student new];
p->age = 100;
[p walk];
子类对象赋值给父类指针
父类指针访问对应的属性和方法
3.3 多态的优缺点
优点:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象
缺点: 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法
以下代码中Animal是父类,Dog是子类,run方法是Dog的对象方法
Animal *aa = [Dog new];
// 多态的局限性:父类类型的变量 不能 用来调用子类的方法
//[aa run];
// 将aa转为Dog *类型的变量
Dog *dd = (Dog *)aa;
[dd run];
3.4 多态的细节
动态绑定:在运行时根据对象的类型确定动态调用的方法
以下代码中Animal是父类,Dog是子类,[a eat]调用的时Dog的eat方法
// 多态:父类指针指向子类对象
Animal *a = [Dog new];
// 调用方法时会检测对象的真实形象
[a eat];