我们再来略为讨论一下可见性的问题。
所谓可见,是数据相对于计算(的需要)而言的——如果数据不需要参与计算,则讨论它的可见与不可见本身就失去了意义。我们这里所说的计算,在对象系统中被称为行为/方法(且方法本身也是对象的性质之一)。这些与计算相关的因素,综合起来有如下几种情况。
其一,以一个对象来说,属性若以“被计算数据(P)”和“计算行为(M)”来区分的话,则P本身就有对M的可见性问题,
M1是否可以访问P1?若可以,那么M2能否访问P1?这个问题的有趣之处在于,在当前我们对对象系统的设计中,M,是能访问P,的,因为它们是属于同一个对象的性质。但若P1只需要被M1访问,那么P1是否应该仅是M1的一个私有变量?例如代码:aMan ={height:1.75, //身高heighten: function(){...},//增高weight:70,//体重loseweight: function() {...}//减肥6|};显然,身高与体重都是aman的性质,但身高与增高有关,与减肥却没什么关系。所以是否应该考虑height是heighten()的一个私有的、计算用的数据呢?但如果这样,height难道又不是aman的性质了吗?更进一步说,我们的现状是:让任一方法M1都必将面对所有的属性Px。这在一定程度上增加了对象自身构造时的复杂性。
其二,以一个对象作为系统中待处理的数据来说,则对象本身(与其所有属性)就有对系统的可见问题,
系统内,系统外私有对象OP1M1P2M2公开图2-25 对象之于系统的可见性问题因为外部系统可能需要了解P2与M2,而并不需要了解P1与M1,因此P1与M₁就应当对外部不可见(内部私有,internal-private),P2与M2就应该是对外部可见的(公开,public)。再者,与上面的一个问题相关,在P2与M2中又将涉及到P2是否需要被公开的问题。yipindushu.com
其三,若一个对象作为继承层次中的一层,则对象有对其他末端层次的可见问题,
因为对象C的实现可能依赖于一些对象B的性质,也可能根本就不依赖某些性质。对于完全不依赖的,就不需要由B继承到C,因此这里的“私有”并不单单表明对象C是否可见,而且表明性质P11/M11是否要从类继承关系上完全隔离开来,确保对象C无法通过继承得到。反之,我们就应该让对象C可以继承P22/M22,以确保其他行为可以访问它们(内部——在继承链上的——保护,internal-protected)。
其四,基于上述问题的进一步设问是:若外部系统中有一个对象是继承自对象B而得来的呢?
这种情况下,对于P22/M22,我们仍然需要让外部系统可以在对象D中访问到(外部——在继承链上的——保护,protected)。
回顾上一小节的的讨论:多态性是对象的性质在其继承关系上的表现,而本节内容则指出这一表现的具体方法(即可见性)包括:□可见但限于在内部实现的子类的,即protected internal;□可见并允许包括外部系统实现的所有子类的,即protected。
上述分析也表明:如果要在对象继承中,利用子类相对于父类的多态特性,则相关的性质必然是上述两种可见性的。除此之外,其他的可见性还包括:□不可见,即private;□可见但与继承性无关,即internal和public。
版权声明
本站素材均来源与互联网和网友投稿,欢迎学习分享
【节数以及对数据的性质的思考26:http://www.yipindushu.com/xuexifangfa/16554.html
推荐文章
02-02
1 初中英语学习方法指导09-13
2 【节数以及对数据的性质的思考709-13
3 激励你拼搏的满满正能量语录大全02-07
4 成人学习方法和技巧02-08
5 如何才能提高学习效率