运行时多态
重写override
重写方法
没有重写的方法会被重写
没有重写的方法中调用已经重写的方法会调用重写后的新方法而不是父类中的旧方法
把指针的声明类型Rectangle改成Shape也不会有任何影响,因为声明类型不重要,重要的是指针实际指向的类型
属性也可以重写,但本质上属性背后的访问器方法被override
重载
方法名相同,参数不同不可以共存
方法名(参数名)不同,参数相同可以共存
因此OC不支持方法重载
super仅指父类(Shape),没有多态性
相比之下,self有多态性,可以指向不同子类,即在不同的子类(Circle,Rectangle)中会调用各个子类的方法
内存模型
rect-》Rectangle Class(类)-》methodList-》各种方法(draw,print)
因此,多态调用涉及地址的动态辨析,但这种模式的代价是效率较低
继承中的初始化器和析构器
子类自动继承基类的初始化器
子类也可以重写基类的初始化器(如Shape重写了NSObject的初始化器,而Rectangle则重写了�Shape的初始化器)但此时必须手动调用基类的初始化器self=[super init];
析构器也可以继承或重写,子类析构器运行后会自动后置调用基类析构器,同时不可以手动调用
子类析构器也具有多态性
注意:避免在父类的init或dealloc中调用子类重写的方法,否则子类重写的init在继承基类的init时调用的是子类中重写后的方法,而重写后的方法中可能包含尚未在子类init中初始化的实例变量。而dealloc中也不要调用子类的方法,因为子类已经被释放
网友评论