小糖出品:面向对象三大特性之多态

来源:互联网 发布:win10怎么更改公用网络 编辑:程序博客网 时间:2024/04/30 00:47

                           上一篇博客,小糖介绍了面向对象三大特性中的继承,到现在,三大特性小糖介绍了两个,今天小糖就来讲讲最后一个特性:多态。

                           在引入多态之前,小糖先举个例子,假如现在有两样乐器,需要一个演奏家来弹奏乐器。我们来对这个过程进行实现。首先,定义一个乐器类并实现:

                                                                 

然后我们再定义两个乐器类,比如是钢琴和小提琴,现在我们进行如下定义和实现:

可以看出,我们在类中都进行了方法重写,并且都继承与总乐器类。那么我们也需要定义一个演奏家来演奏乐器。

我们在演奏家中定义了两个方法,使用钢琴和使用小提琴的方法并进行了实现。接下来我们需要调用该方法。

这是主函数中的实现。纵观整个过程,感觉都很合理,但是,不知道大家想过没有,如果我要在添加一项乐器的话,需要改动什么?不仅要定义类,还要在Person类中增加方法,虽然你可能感觉这样没什么,但是一旦你要加入多个的时候,多次写方法是非常麻烦的一件事。那么,我们有什么办法改进吗?这个时候,我们就得引进多态。

                        现在,小糖问一个问题,想上面代码中,如果我这么创建对象的话可以吗?

                                        Instrument * p = [[piano alloc] init];

这样可以吗?其实,这样写是可以得,编译器不会报错,而且如果你调用方法的话是可以正常调用的。我们可以概括成一句话:父类声明的变量,可以指向子类对象。也就是子类创建出来的对象,可以由父类声明出来的变量接收地址,也就是指向。那么现在,我们可以对上述Person类里面的定义与实现变成下面这样:

                           

也就是我们可以将参数变为父类所声明的参数,这样就可以接受它所继承的任何子类的对象。也就是上面那句话。这样,不管你要添加多少个乐器,Person类内部都无需做修改,下面给出修改后的调用方法:

                        

这样,就可以利用多态的思想,让该程序变得更容易修改。
                        说到这,相信大家对多态有了自己的理解,其实多态就是当把一个子类对象直接赋给父类指针变量,当运行时调用该指针变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现相同类型的变量调用同一个方法适合呈现出多种不同的行为特征。那接下来我们来看看形成多态的条件:

                                     1.要有继承

                                     2.要有方法重写

                                     3.父类声明的变量,指向子类对象

满足这三个条件,就可以形成多态。

                       好了,关于多态的话,小糖就讲到这里了,有什么不对的地方可以提出来,小糖虚心接受并改正。那么,我们下一篇博客再见咯。

0 0
原创粉丝点击