类与类的关系杂谈

来源:互联网 发布:gmp软件 编辑:程序博客网 时间:2024/06/11 16:35

类与类关系

综述:类与类的关系分为四种:依赖、泛化(继承)、关联、实现

1    依赖:即:use-a的关系,如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类

示例代码1

public class Tuition {     //学费,作为非九年义务教育的的学生,是用来被人类使用的}public class Student{       public void payTuition(Tuition src){  //交学费,需使用学费}}
说明:Student类的payTuition()方法在使用时就得传入一个Tuition类型的参数,这样Tuition的改变就会影响到Student对象的状态,因此Student与Tuition之间就是依赖关系(Student依赖于Tuition);一个类的对象通过另一个类的方法进而影响另一个类的状态

补充:尽量将相互依赖的类减至最少,也就是让类之间的耦合度最小


2     继承:即:is-a关系,是一种特殊和一般的关系,是衍生与派生关系

继承特点:子类继承父类的所有属性和行为,在子类中还可以增加新的属性和行为,也可以覆盖父类的行为。

继承语法:子类名 extends 父类名;

示例代码2

public class Sportsman {}public class Paddler extends Sportsman  {}
说明:Paddler(乒乓球运动员)继承Sportsman(运动员),因此Paddler与Sportsman之间是继承关系。

3    关联:是一种结构关系,说明一个事物的对象与另一个事物的对象相联系。给定有关联的两个类,可以从一个类的对象得到另一个类的对象。关联有两元关系和多元关系。两元关系是指一种一对一的关系,多元关系是一对多或多对一的关系。两个类之间的简单关联表示了两个同等地位类之间的结构关系。

示例代码3

public class Institute {   //学院private Professor professor ;  //一个学院教授,学院与教授之间是一种关联关系。private GraduateStudent graduateStudent //学院研究生,学院与研究生也是一种关联关系}public class Professor{}
说明:教授和研究生作为学院属性,不同于上面的依赖。依赖的话,教授和研究生的改变会影响学院,显然不是。在这里仅仅作为公司的一个属性而存在。因此Institute与Professor和GraduateStudent之间是关联关系

4     聚合

       聚合是一种特殊的关联。它描述了“has-a”关系,表示整体对象拥有部分对象。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。聚合是较强的关联关系,强调的是整体与部分 之间的关系。例如,学校和学生的关系。聚合的整体和部分之间在生命周期上没有什么必然的联系,部分对象可以在整体对象创建之前创建,也可以在整体对象销毁之后销毁。

示例代码4

public class Class{//班级}public class Student{//学生       private List<Menu> menus ;}

学校是整体,而学生是部分。学校与学生都是可以独立存在的,之间没有什么必然的联系。因此学校与学生就是聚合关系。

5    组合

       组合是聚合的一种形式,它具有更强的拥有关系,强调整体与部分的生命周期是一致的,整体负责部分的生命周期的管理。生命周期一致指的是部分必须在组合创建的同时或者之后创建,在组合销毁之前或者同时销毁,部分的生命周期不会超出组合的生命周期。例如Windows的窗口和窗口上的菜单就是组合关系。如果整体被销毁,部分也必须跟着一起被销毁,如果所有者被复制,部分也必须一起被复制。

示例代码5

public class Menu{}public class Window{       private List<Menu> menus ;}
说明:菜单的存在前提是窗口的存在,两者之间存在很强的拥有关系。且窗口对菜单的生命周期负责,只有在窗口创建之后,菜单才能够创建,菜单必须在窗口销毁之前销毁。因此Window与Menu之间是组合关系。

两者联系:

聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
另外有一个差别是组合中的一个对象在同一时刻只能属于一个组合对象,而聚合的一个部分对象可以被多个整体对象聚合,例如一个学生可以在多个学校就读,而一个菜单在同一时刻只能是某个窗口内的对象。

实现方式区别(重要)
(1)    依赖关系:关系对象出现在局部变量或者方法的参数里,或者关系类的静态方法被调用
(2)    关联关系:关系对象出现在实例变量中
(3)    聚合关系:关系对象出现在实例变量中
(4)    合成关系:关系对象出现在实例变量中