objective-C学习笔记(六)继承与多态

时间:2022-07-17 04:29:12

封装 encapsulation

隐藏对象内部实现细节,对外仅提供公共接口访问。

(说白了就是属性啊,方法啊全都写在类内,对外只提供访问,不需要了解细节)

继承 inheritance

    一个类型在另外类型基础上进行的扩展实现。

多态 polymorphism

不同类型针对同一行为接口的不同实现方式。

OBJC的继承

【单继承】每一个类只能有一个基类,子类自动继承基类的:

·实例变量

·属性

·实例方法

·类方法

了解所有类的根类:NSObject

继承的两层含义:

成员复用: 子类复用基类成员

类型抽象: 将子类当作父类来使用(IS-A关系准则)

在子类的对象内存中,可以找到一个完全的父类对象内存。

继承中的init和dealloc

子类自动继承基类的初始化器

子类也可以重写基类初始化器,此时子类初始化器必须首先调用基类的一个初始化器(手工调用 self = [super init];)。

子类可以选择继承基类析构器,或者重写基类析构器。

子类析构器执行完毕以后,会自动调用基类析构器(后置调用,且不支持手工调用 [super dealloc]会报错,除非关闭ARC)。

子类析构器自动具有多态性。

Tips:尽量避免在父类init和dealloc中调用子类重写的方法。因为子类在初始化的时候,会自动前置调用父类的初始化器,而父类的初始化器里面调用子类重写方法的话,子类都还没有初始化完毕,这个方法就会报错。析构器也是一样,因为子类重写的析构器,会在最后调用父类的基析构器(后置调用),这时候父类析构器里还有调用子类的方法的话,那些内存早就已经被释放掉了,直接回报错。

多态 运行时多态 Polymorphism

   子类在父类统一行为接口下,表现不同的实现方式。

重写与重载

重写:(与父类同名同参数方法)子类可以重写父类的方法。

重载:(与父类同名不同参数方法)OBJC不支持方法重载,

外部参数不同就直接是另一个方法;外部参数相同而内部参数不同(参数名或者类型)会直接报错。

继承自父类的方法,需要重写的话,直接在实现类上重写就可以了,不需要重新在接口类中声明。

self和super

self具有多态性,可以指向不同子类

super没有多态性,仅指向当前父类