发布: 2008-4-23 15:44 |
作者: 不详 |
来源:
www.wushuang.net |
查看: 101次 | 进入软件测试论坛讨论
领测软件测试网
软件测试技术门户l&JHp f-u?y*}软件测试技术门户O![(h!fS,Q设计思想是,用户通过Shape的public接口来操纵它们,而派生类(例如Circle和Triangle)的实现部分则共享由protected成员表现的那部分实现(implementation)。
T
@a"In`a软件测试技术门户6EL^:m0|]这不是一件容易的事情:确定哪些实现部分是对所有的派生类都有用的,并将之共享出来。因此,与public接口相比,protected成员往往要做多得多的改动。举例来说,虽然理论上“中心”(center)对所有的图形都是一个有效的概念,但当你要维护一个三角形的“中心”的时候,是一件非常麻烦的事情——对于三角形,当且仅当它确实被需要的时候,计算这个中心才是有意义的。
软件测试技术门户{5w(gl1F.J$k3w*X']f pCM^&l,Tprotected成员很可能要依赖于实现部分的细节,而Shape的用户(译注:user此处译为用户,指使用Shape类的代码,下同)却不见得必须依赖它们。举例来说,很多(大多数?)使用Shape的代码在逻辑上是与“颜色”无关的,但是由于Shape中“颜色”这个定义的存在,却可能需要一堆复杂的头文件,来结合操作系统的颜色概念。
软件测试技术门户 g0}NO$e BM/x0\J/nt当protected部分发生了改变时,使用Shape的代码必须重新编译——即使只有派生类的实现部分才能够访问protected成员。
软件测试技术门户B v!F2og k|6\#S,s软件测试技术门户Wd$B1EMX于是,基类中的“实现相关的信息”(information helpful to implementers)对用户来说变成了象接口一样敏感的东西,它的存在导致了实现部分的不稳定,用户代码的无谓的重编译(当实现部分发生改变时),以及将头文件无节制地包含进用户代码中(因为“实现相关的信息”需要它们)。有时这被称为“脆弱的基类问题”(brittle base class problem)。
'iEK%i2hvuF,x\qRe4G一个很明显的解决方案就是,忽略基类中那些象接口一样被使用的“实现相关的信息”。换句话说,使用接口,纯粹的接口。也就是说,用抽象基类的方式来表示接口:
软件测试技术门户#hB5m)zKZ软件测试技术门户dga,C