draw aso move〔〕 colors A ircle q Triangle I Flip'Verti calO FlipHorizontalo 尽管有些时候继承会隐含(特别是在Java,其 extends关键词专门用于 继承)你准备往接口里加进一些新的方法,但这并不是必须的。第二个 也是更重要的区分方法是在新的类中修改基类方法的行为。这被称为覆写 ( override)那个方法 sh move( colore setcoloro Circle square Triangle draw) erased erased 要覆写一个方法,你只要直接在派生类里重新定义那个方法就行了。你的 意思是“我这里要用的是同一个接口里的方法,不过我要让它为新的类做 些不同的事。” 是”与“像”的关系 第11共34页
shhgs@wgqqh.com 11 ✁ ✂ 34 ✁ 11 rFmÌMöKº"(µ¼F Ja va § exten ds (³ì) öK)¡ÔùÞ$XËät3ÌR(µ Xo(× [%( µFR(/*ïðY/µ(E =Ýñ« (override)Y×µ %ñ«3×µ¡ó%Ò$FÇ0/ËROY×µE,¡( ¹DÍ Ë%(3×$XË(µX^%ÇAR(/T 3ÌX(Ï
继承能引发如下的争论;继承是不是应该“只覆写”基类中的方法(不能 加入基类中没有的方法)?也就是说,因为接口相同,所以派生类“也就 是”基类。结果是你能用派生类的对象直接替换基类的对象。你可以把这 种情况想成完全替换( pure substitutionη),通常这被称为替换原则 ( substitution principle)。从某种意义上讲,这是使用继承的理想方 法。通常我们把基类同派生类的这种关系称作是(s-a)关系,因为我们会 说“圆是一种形状”。有一种测试继承的方法,就是问自己能不能说这两 个类之间存在“是”关系。 有时你不得不往派生类里加上一些新的接口元素,这样派生类的接口就得 到了扩展,而派生类也因此变成了一个新的类。基类还是可以被新的类所 替代,但是这种替换是不完全的,因为新的方法无法通过基类的接口访 问。这可以被称为“像(-ke-a)”关系(我的术语)。新类有旧类的接 口,但是还有它自己的方法,所以实际上你不能说它们完全相同。举空调 为例。假设你屋子已经有了一个制冷控制系统;也就是说它有一个制冷的 接口。假设空调坏了,于是你把它换成了一个既能制冷也能制热的热泵 热泵“像”一个空调,但是它的功能更多。由于房子的设计只支持制冷 因此它只能同新对象的制冷部分通信。新对象的接口已经扩展过了,而现 有的系统对此一无所知,它只知道原先的接口 Thermostat Controls Cooling System l overTemperature coolO Air Conditioner Heat Pump polo olO 当然看到这个设计图之后,一切就变得很清除了,基类“ cooling syste”没有包括制热,因此还不够通用。把制热再加进去之后,替换 原则就能生效了。当然,这个图只是对真实设计所会发生的情况举个例 子 当你看到替换原则时,你会认为这种方法(完全替换 pure substitution 应该是你的不二之选。实际上如果这种设计能行得通的话,这个方法确实 很好。但有时你也会发现,往派生类的接口里加新的方法也一样可以做得 井井有条。仔细观察之后,该用哪种,不该用哪种,其实是很明显的 可凭借多态性相互替换的对象 第12页共34页
shhgs@wgqqh.com 12 ✁ ✂ 34 ✁ 12 öK;+ìÄÆ(òû öKXvwÍ óñ«ÏY/*(µ(X; ätY/*m(µ) Ê[$æ$X>DEÇ0/Í [ ÏY/IÅ¡;Ç0/(¥VÒ$óÀY/(¥V¡ÝEP [|cóÀ(pure substitution)· =ÝóÀå0 (substitution principle)´¹J© çöK(¢|µ ·PY/Ç0/( wÝ1(is-a)wæº $Í ß3ëÏm3®¯öK(µýþ;X;$ e ×/u4ùFÍ Ïw m¡XXÞÇ0/ËäJ3ÌR($XÛÜ ¦Ç0/($X g,D8àÇ0/[æòá,3×R(/Y/ÝE=R(/D óp óÀXc(æR(µÜ^Y/($X ÝE=ÝÍ }(is-like-a)Ïw ((±)R/mô/($ XmAýþ(µDEñJ¡X;$Ac>B âZ[¡õôõm,3×nöÊnw5 [$Am3×nö( $XZ[,)¡PAÀ,3×í;nö[;n÷(÷ø ÷øÍ }Ï3×A(ô;Vç)ù([1ótúnö æòAó;R¥V(nöR¥V($XôõD8^,àí m(w5¥ò3ÜDAóå/($X ;<g ×[1Ëu3ál3,Y/Í cool i n g system Ïm!ûn÷æòX_Pn÷ÁätJuóÀ å0;0Ø, ; ×Ëó¥<ñ[1Dºì0([B×â ¡<góÀå0¡ºÙ µ(cóÀ p u re su b stitu ti on ) vw¡(Xu²ñJÄÅ [1;E( ×µñ m¡[ºìíÞÇ0/($XËäR(µ[3¦ÝET ¾¾mÄðu¸¹uwmXwm§ñÏ×( !