类的聚集

回顾上一节的知识点,先进行一个总结,无非是以下几点:

1、一般情况下,将共同的操作放到父类中,将具体用途的操作放在子类中,例如在Vehicle类中将color和maxSpeed作为交通工具的共有属性,把启动方法start()和停止方法stop()作为它们的共有方法。
2、继承时一个比较好的原则是将类的成员变量设置成private(私有变量),一般将方法设置成public(共有方法 )。
3、理解is-a:is-a表示“是一个”的意思。例如交通工具和汽车, 汽车就是交通工具的一种,此时就可以创建一个汽车类继承表示交通工具的类。
4、过多层次的继承并不利于软件的开发和调试。这一点在后面会讲到。
 
 现在我们开始进行新的内容--类的聚集
一、聚集初步
前面讲完了继承之后我们深切的感受到继承可以实现一些重复代码的复用,这也就是为什么我们要引入继承,而另外一种可以实现代码复用的方法就是使用“聚集”,也称作“合成”或者“组合”。这种方法的基本原理(核心)是在一个类中创建另一个类的对象,并通过创建的对象的句柄来执行相应的操作,举例如下:
eg:  class Gearbox{
..........
}//****这是一个表示变速箱的类
  public class SportsCar{
Gearbox gb = new Gearbox();
}
在创建完对象之后就可以使用已经创建的对象对相应类中的方和变量进行操作了,如果上面的Gearbox {}中存在一个start()方法,就可以通过这种方式进行调用了:gb.start(); 当然在聚集中也存在着方法的重写,这些与继承有着异曲同工之妙,还有不止上面这两种简单的操作方法,还可以允许更多的类进行聚集,;这些类之间在原则上是不要求有着相互关系的,但是我们都知道,在一个文件中几个类之间有着必然的联系,因为他们同在一个文件(工程)下,所以很可能以后看见的相互聚集的类之间有着很强的关联性,但是如果之间没有一定的关联性也没有关系,我们最终的要知道,在聚集的概念不要求这么严格,它不像继承那么严格。
二、继承和聚集的选择
要我们进行继承和聚集的选择,说白了也就是辨别继承和聚集之间的不同点与相同点,我们从以下几点进行辨别:
相同点:
            1、都允许在自己的类中加入其它类的对象去访问相应的对象、操作相关的方法。
不同点:
    1、理解is-a和has-a。在继承中我们提到过,is-a表示“是一个”的意思,可以理解成为一种“属于”关系。表示这个意思的就可以用继承来实现。像跑车属于汽车的一种,汽车属于交通工具的一种,has-a表示“有一个”的意思。可以把它理解为一个“包含”关系。表示这个意思的就可以使用聚集来实现。例如,车包含发动机、变速箱、制动装置等(当然这些包含关系没有继承中那些关系那么严格)。
     2、继承当中子类和父类之间的耦合性是比较高的。相对于继承来的较高的耦合性,使用聚集对程序早成的耦合性要相对小,聚集中没有继承中那种层与层之间的严格层次结构,与继承相比使用更灵活一些。
     3、由于在继承中通常父类的改变通常会对底层子类的改变带来一定的困难,所以使用聚集实现代码复用的情况下,应该选择聚集。
     4、如果程序中需要实现“向上转型”的操作,则应该考虑使用继承来实现。
posted @ 2016-09-10 09:46  Kevin_YZLong  阅读(723)  评论(0)    收藏  举报