依赖(dependence),即 uses-a 关系。例如,Order 类使用 Account 类是因为 Order 对象需要访问 Account 对象查看信用状态。因此,如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。 应该尽可能的将相互依赖的类减至最少。我们如果 A 不知道 B 的存在,他就不会关心 B 的任何改变(这意味着 B 的改变不会导致 A 产生任何 bug)。用软件工程的术语来说,就是让类之间的耦合度最小。
聚合(aggressive),即 has-a 关系。例如,一个 Order 对象包含一些 Item 对象。聚合关系意味着类 A 的对象包含类 B 的对象。
继承(inheritance),即 is-a 关系。例如,RushOrder 类由 Order 类继承而来。在具有特殊性的 RushOrder 类中包含了一些用于优先处理的特殊方法,以及一个计算运费的不同方法;而其他的方法从 Order 类继承了来的。一般而言,如果类 A 扩展类 B,类 A 不但包含从类 B 继承的方法,还会拥有一些额外的功能。
4.2 使用预定义类
在对象与对象变量之间存在着一个重要的区别。例如:
Date deadline; // deadline doesn't refer to any object
定义了一个对象变量 deadline,它可以引用 Date 类型的对象。但是,一定要认识到:变量 deading 不是一个对象,实际上也没有引用对象。此时,不能将任何 Date 方法应用与这个变量上。
classEmployee{ ... private Date hireDay; public Date getHireDay(){ return Date hireDay; } }
这样会破坏封装性!代码:
Employee harry = ...; Date d = harry.getHireDay(); doule tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000; d.setTime(d.getTime() - (long)tenYearsInMilliSeconds); // let's give Harry ten years of added seniority
出错的原因很微妙。d 和 harry.hireDay 引用同一个对象。对 d 调用更改器方法就可以自动地改变这个雇员的私有状态!