老樣子,還是強調名詞的存在是讓他能更容易的溝通,簡潔的敘述就可以讓雙方達成共識。但若只是想要用硬背的將名詞定義記住而不知當中的內涵,我想那倒不如捨去這些名詞,直接以白話開場還來的更有意義一些。在O.O.中常會聽到兩個名字”is-a”跟”has-a”下面就針對兩者做介紹,希望對讀者有所幫助。

 

is-a,其實就是:is a kind of簡略的說法!想想若有兩個類別PersonSuperman,由於我們可以確認Superman必定為Person,故Superman有很多相關的資訊可以藉由繼承Person此一類別,以增加code reuse的效果,此時我們常將兩者之間的關係唸成:Superman is a kind of Person,也就是超人也是人的概念(這樣應該很容易理解了吧…ha)一旦有is-a的概念其實就是有繼承的動作出現,若以java來看,可以寫成:

//宣告出Person的類別

class Person{ }

 

//宣告出Superman的類別,且繼承Person的屬性跟運作

class Superman extends Person{ }

 

has-a,其實是聚合或組合的概念!簡單來說當一個類別A中的宣告包含了另一個類別B的型態,我們可以將之稱為:『A has a B』,也就是class A中的成員包含了B,故將來可以在A當中操作B的資訊。以簡易的概念來說明:若有一個類別叫做馬戲團,另一個類別叫做動物,可想而知在馬戲團的表演過程一定會有動物參與,所以我們可以說馬戲團類別成員中有一個動物的型態的物件。若以程式說明如下:

class Animal { }

 

class Circus

{

  public Animal a; //代表馬戲團中有包含到Animal型態

}

然而has-a的概念中又可以進一步細分為AggregationComposition兩種。無論是Aggregation(聚合)Composition(組合)兩者相同點是均描述整體(Whole)與其組件(Parts)之關係,一般而言常聽到的whole/part指的就是在描述聚合或組合的概念,也就是均表達一個較大類別之物件(整體)是由另一些較小類別之物件(組件)組成。其中組合又是聚集的一種特例,組合有較強的限制,例如整體存在組件就存在,整體消失組件就消失,也就是,組件不能單獨存在。

 

design pattern的前輩們帶來的忠告:多用合成、少用繼承。這樣的概念在剛開始學物件導向的朋友們一定會很納悶,為什麼要繼承要少用一點,其實主要是跟日後的可擴充性還有程式碼的簡易性而言,繼承的使用不易達到上述目的;反之利用合成的概念搭配介面的適當設計其實可以有效的鬆綁whole/part之間的緊密相依性,舉例而言:在馬戲團中,有一個動物的介面,而在動物介面中可以有很多種如狗、貓、獅子等去將之實做,如此馬戲團在操作的過程可以不用過問目前在表演的動物為何,只需要直接操作動物此一介面即可。最後,在執行階段自然就會依據所給予動物介面的實體物件去做動態繫結(也就是多型的效果)達到一套演算法,多種具象類別之實體皆可同時適用的效果,在design pattern中其實這種設計模式謂之『strategy design pattern(策略模式)』。

 

Noteis-a代表類別之間階層的父子關係。has-a代表類別之間的whole/part關係。

arrow
arrow
    全站熱搜

    劉逸 發表在 痞客邦 留言(3) 人氣()