一、继承的理解
继承的概念可以理解为集合的包含关系,不应以现实中的继承来理解。因为继承涉及到一个父类和子类的关系,儿子继承了父亲可以理解,但是人类继承了动物就难以理解了。父类:ParentClass、SuperClass,子类:ChildClass、SubClass。
继承是为了方便对类的管理,对于一些有共性的属性和方法,可以将这些属性和方法抽象出来,作为一个父类,其他子类可以继承父类的这些属性和方法,还可以有自己独有的属性和方法。在代码维护上就有很大的作用。
1.理解private/protected/public
private: 只能在当前类进行访问,无法被继承,也无法被外部函数访问,它仅局限于当前类。
protected: 能再当前类访问,能被继承被子类访问,但无法被外部函数访问,它仅局限于有继承关系的父子类之间。
public:完全公开,能被所有类进行访问。
2.假设一个类Student继承了People类,那么:
People声明的非private属性和方法,子类自然而然就有了。因为People类的方法已经在People.h中进行了声明,在People.m中进行了实现。所以Student类既不需要在Student.h中对这些属性和方法进行重新声明,也不需要在Student.m中对这些方法进行实现,就可以使用Student类的对象进行调用了。
在Student.h文件中,声明的属性和方法,都应该是子类自己独有的属性和方法。对于已经继承的属性和方法,不需要做任何声明。
在Student.m文件中,也只需要对自己独有的方法进行实现。对于已经继承的方法,只有需要进行重写的时候,才需要重新实现,但是.h文件中不必对重写的方法进行声明。
3.多态的理解
对于同一个接口,不同的实现,称为:“多态”。重写是多态的一种。(接口之间的继承称为实现)
4.派生类
使用框架中的类,或者已经写好的类,继承该类,生成一个派生类,比原来的类更好用。
假设现在有一个已经写好的类Poeple,但是对于当前场景不是很适合,于是创建一个新的类Teacher继承Poeple类,更加适合当前的场景。
Foundation框架下的NSString NSArray NSDictionary类,除了官方声明的继承的子类,我们无法去继承,创建一个新的子类。这时,如果想要新增一些方法,只能使用Category
5.虚方法
Human * human = [[Human alloc] init]; Animal * animal = human; [animal work];
分析:
向上转型,将子类的指针赋予父类的指针。
在上面的例子中,human和animal指针都指向同一个human对象,结果调用的还是human的方法。原因是因为OC的方法都是虚方法,调用时不看指针看对象,对象的地址调用对象的方法。
6.向上转型和虚方法的进一步理解实例
同一事件被不同的事物调用产生不同的效果。
假设有三个类:Dog Cat Frog,三个类都继承自Animal类,Animal类有一个方法,beBeaten,子类都进行了重写。
假设有一个类:Human,该类有一个方法,beat,需要传入参数为Animal对象指针。
-(void)beat:(Animal)animal{
[animal beBeaten];
}
Dog * dog = [[Dog alloc] init];
Cat * cat = [[Cat alloc] init];
Human * human = [[Human alloc] init];
[human beat: dog]; //这里传入参数的时候自动向上转型,但是其本质还是指向子类的对象
[human beat cat];
@诗未冷学习博客