可以访问这个 package中其它类的“缺省权限”的成员,但是出了这个 package,它们就都是 private的了。 复用实现 类创建完成并且测试通过之后,它就应该能(很好地)表示一段有用的 代码。但实际上代码复用并不像我们希望的那样容易;要设计一个复用性 良好的对象,需要经验和远见。代码复用是OOP语言最显著的优点之 复用代码最简单的方式是直接用这个类来创建对象,但是你也可以将那个 类的对象放到一个新的类中。我们把它称为“创建一个成员对象”。为了 能让那个新的类提供你所设计的功能,它可以由任意多个,任意类型的对 象,以任意形式组合在一起。由于你是用已有的类来合成新的类,因此这 一概念被称为合成( composition,如果这个对象是动态合成的,通常把 它称为聚合 aggregation)。通常将合成称为“有(has-a)”关系,就像 轿车有引擎 C Engine (这个讲解轿车的UML关系图,用实心菱形表示合成关系。通常如果要 让我表示这个关系的话会更简单:就是一根直线,没有菱形。l) 合成具有极大的灵活性。新类里面的成员对象通常都是 private的,因此 使用这些类的客户程序员们是无法访问这些对象的。这点能让你在不影响 已有的客户代码的前提下,修改这些类。你还可以在运行时修改这些成员 对象,并以此动态地改变程序地运行。下面要讲的继承就没有这种灵活 性,如果你用继承创建一个类,编译器肯定会加上某些编译时的限制的 由于继承在OoP中是如此重要,因此会被反复强调,以至于新手们会认 为,应该尽量使用继承。其实一味的使用继承会导致很奇怪也很复杂的设 计。相反,在创建新类的时候,你应该优先考虑使用合成,这么做会更简 单也更灵活。如果这么做的话,整个设计也会变得更加井井有条。等你有 了一点经验之后,你就会自然而然的知道继承应该用在哪里了 继承:复用接口 对象这个概念本身就是一件很有力的工具。它能让你依照概念把数据与功 能结合在一起,这样你就不用站在运行程序的计算机的角度上,而是站在 解决问题的角度上来写代码了。这个概念作为程序的基本单位,在编程语 言中用 class这个关键词表示。 第8页共34页shhgs@wgqqh.com 8 ✁ ✂ 34 ✁ 8 ÝE × p a cka g e *§A/(Í ¬ÈÏ(!, × p a cka g eAÆ p ri va te (, 3Ô/k®¯^uAvw; (r)G3¦m( pñJpX}7(Y¦RS %[13× (¥Vî%õ\° p OOP b×Ð(wCu 3 pb (µ´Ò$ ×/Q¥V¡[ÝEY× /(¥Vkg3×R(/*PAÝÍ 3×¥VÏ, ;ÇY×R(/¡D[1(ô;AÝEç¹V×¹/(¥ VE¹´-F39ç)¡ôm(/QR(/æò 3Ö=Ý(compositionÄÅ ×¥V ì(·P AÝx aggregation)·ÝÍ m(h a s-a )Ïw} Í ±Fm+²Ï ( ש£±F( U M L wËñq³Gw·ÄÅ% ÇG ×w(º 73Ò´m³ ✄ ✠ ✆ ) AmµÂ(äåR/˶(¥V·Æ p ri va te (æò ç Ì/(/0âhÜ Ì¥V( C;Ç¡FX ôm(/0p(Æïð Ì/¡ÝEFXEïð Ì ¥VEò ìrðáâhrXEƶ%©(öKm äå ÄÅ¡öK3×/á7¶OºäJ´Ìá(Èn( ç)öKF OOP *Äò%æòº=>æE)R·ºÙ vwrçöK§ñ3¸(çöKº¹º»¼[([ 1>>FR/(M¡vww/½ç ZTº [äåÄÅ ZT(¤×[1[ºáä¾¾mÄ-¡m ,3Cõ\u¡ºý;à;(öKvwFmË, ¥V ×Ö p3Åmã(yAA;Ç¡õÖP,ô ;IF39 ¦¡XIFXEâh(123(zJàIF £N(zJQ«p, ×Ö1âh(Y ¿Fáâ * class ×(³G