OOD沉思录 之 类和对象的关系--包含关系4
4.9 在实现语义约束时,最好根据类定义来实现。但是这经常会导致泛滥成灾的类,在这种情况下约束应当在类的行为中实现,通常在类的构造函数中实现,但不是必须如此。 class 汽车 { 汽车(发动机 para) { m_发动机=para; } 发动机 m_发动机; } class 发动机{...}
class 奥迪A6:汽车{......} class 凯梅瑞:汽车{......}
class 丰田发动机:发动机{......} class 三菱发动机:发动机{......}
问题,假设奥迪A6只能使用丰田发动机,凯梅瑞只能使用三菱发动机,问题是汽车只包含了抽象的发动机,对抽象的汽车类来说,所有发动机没有任何区别,那么需要我们把这个 奥迪A6(丰田发动机 para):base(para){} 凯梅瑞(三菱发动机 para):base(para){}
class 汽车 { 。。。。。。 void 启动() { //先检查汽车的状态,如果状态不合法,则告诉用户汽车无法启动,因为什么原因;如果合法,则开启发动机 if(检查状态()) m_发动机.启动(); else throw "汽车使用了不配套的发动机!"; } }
4.10 在类的构造函数中实现语义约束时,把约束测试放到构造函数领域所允许的尽量深的包含层次中。 class 汽车 { 汽车(发动机 para) { if(!检查状态(para))//这个检查状态的实现和上面类似,从一个字典里查询 throw new "发动机不匹配"; } }
4.11 约束所依赖的语义信息如果经常改变,那么最好放在一个集中式的第三方对象中。 4.12 约束所依赖的语义信息如果很少改变,那么最好分布在约束所涉及的各个类中。 类包含的数据成员分为两种,一种是描述性的,如长宽高颜色等,另一种是具有行为的子对象,如汽车包含方向盘,而方向盘本身就是一个具有"有意义的行为"的对象。 4.9 类必须知道它包含什么,但是不能知道谁包含它。 4.10 同一个类包含的对象之间不应当有使用关系。 从复用性和复杂性角度考虑。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |