OC基础-继承

一、继承的理解

继承的概念可以理解为集合的包含关系,不应以现实中的继承来理解。因为继承涉及到一个父类和子类的关系,儿子继承了父亲可以理解,但是人类继承了动物就难以理解了。父类: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];

其中work是animal的方法,human重写了该方法。上面的结果是:调用了human的方法。

分析:

向上转型,将子类的指针赋予父类的指针。

在上面的例子中,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];


@诗未冷学习博客

你可能感兴趣的:(继承,多态,oc,Object-C,虚方法)