继承:类和类之间的关系
派生:子类在父类基础上衍变出一些新的特性或者功能
子类比父类更加强大
父类 parentClass superClass 【基类】
子类 childClass subClass 【派生类】
NSObject 还可以称为根类
C++ 继承方式
private 私有继承
protected 受保护继承
public 公有继承
OC没有继承方式之说,类似C++中的公有继承
OC的方法全部都是公有的,没有私有方法之说
C++属于多继承 可以继承多个类
多继承缺点:二义性【不确定继承哪个类】
OC没有多继承 属于单继承
OC怎么实现多继承?
通过协议来实现
OC成员变量的访问控制
默认受保护
public:
公有的,作用域:类外可以直接使用【对象指针—>_height】,类内(-)方法可以直接使用;子类继承父类之后,子类(-)方法可以直接使用
+方法不可用,因为和成员变量无关
protected:
受保护,类外不能直接使用,但是可以通过类的方法间接使用;类内(-)方法可以直接使用【子类可以继承】,子类继承父类之后,子类(-)方法可以直接使用
private:
私有,类外不能直接使用,但是可以通过类的方法间接使用;类内(-)方法可以直接使用;子类不能继承父类的私有的成员变量【子类不能直接使用这个私有变量】
子类可以直接使用父类的受保护的和公有的变量,父类私有的子类不能直接使用
父类的私有变量子类可以间接使用父类的方法访问
self.secret
子类对象分为2部分
一部分是继承的父类的变量,还有部分子类自己专有的变量,继承之后都是子类自己的,只是来源不一样
OC有没有私有变量、私有方法?
如果没有,怎样实现
有私有变量 @private修饰
没有像C++一样的私有方法,但是可以实现
OC默认所有的方法都是公有的,子类可以直接使用的
OC如何实现私有的?
【方法有如下2种】
1.在头文件中不声明方法,只在.m类的实现部分实现方法
没有对外公开,只是方便类内的函数来调用
不能调用没有声明的方法
2.把方法声明写在匿名类别中,匿名类别写在类的实现上方
方法的实现仍然在类的实现部分
类的延展、类的扩展、匿名类别
匿名类别可声明成员变量【默认/缺省的访问控制:私有的】子类不可直接继承
匿名类别:可以把不公开的成员方法和变量在匿名类别中进行声明,达到私有化的目的
继承的方法可以不声明
OC是动态的语言,编译时不检测,运行时检测
【OC运行机制】
OC执行方法的过程:【编译时不检测】程序运行到方法调用的时候,首先去指针指向的对象所属的类找有没有实现方法,如果有就调用,如果没有,就去父类的方法中去找,依次类推,直到最后,如果没找到,直接崩溃
super 不是对象也不是方法【当前对象执行父类的方法】
当子类需要在父类的方法基础上扩展一些新的功能,这个时候在重写父类的方法的时候,可以先用super调用父类的方法,再写自己需要扩展的方法
[super printVar];
C++ 没有super 只能通过类域调用[super Father::printVar];
子类重写父类方法后,子类如果想要调用父类的方法,那么需要用super调用
super 只是一个修饰符/编译器符号,表示当前对象去调用父类的方法,仅此而已【不是指针】