close

在程式設計當中常會聽到這兩個詞彙:『Overloading』、『Overriding』。但也發現好像有一些programmer對此兩的名詞不太清楚,所以下面會加以說明,提供大家參考。另外,定義只是初步的認知而已,我不管在上課或工作上都不斷強調請搞清楚Why的層次,在此也會盡可能簡單的說明一下!

 

Overloading!簡化函式命名的最佳幫手。如果要從定義面來看什麼叫做Overloading,其定義如下:『藉由接收的參數串列之型態或數量之不同,以求達到多個函式可共用相同函式名稱謂之』。講白話一點就是明明有很多個函式,但函式名稱卻能一樣,而系統如何判斷這些有相同名稱的函式該呼叫誰呢,主要就是用parameter list傳入的數量跟型別不同而定。以下列例子而言:

void print(int i) {…}

void print(double d) {…}

void print(char c) {...}

這三者都叫做print,但由於參數串列的型態不同所以系統可以自動區別出,當不同型別進來時各自要呼叫哪一個函式。所以對user而言,不管要印出整數、浮點數跟字元,所需做的動作都一樣,例如:print(100)print(3.5)print(‘a’)... see, it’s more easy to use and memorize

 

C++Overloading其實又可以細分為function overloadingoperator overloading其中,function overloading就是上述大家廣為稱呼的overloading;而另一種叫做operator overloading其概念是:不同運算式藉由接收的運算子型態不同來達到共用相同的運算子符號,舉例來說:3+52.3+5.5...這種整數相加跟浮點數相加根本就截然不同,但對外部使用者而言用法都相通只要記得利用 +』這個符號即可將兩個運算元相加,而核心的會自己由系統依據運算子的型別去驅動不一樣的運算 

 

overloading主要的出發點,其實是要給予使用者跟貼心的服務。當清楚overloading的定義之後,要去細想為什麼當初會有overloading這樣的概念出現,試想如果有20種型別,每種都要支援print的方法,若沒有overloading那使用者需要自己記住或常常去查api document,工作的效率自然就降低,若能採用overloadinguser只需要記住呼叫print(參數),之後系統會自動區分。所以若要說overloading的出發點,其目的大概就是下列兩項:

l          降低所需命名的函式名稱。

l          提高user的易用性

 

Overriding!後代不想遵循古禮的設計手法。從定義面來看,所謂Overriding是指:『子類別將父類別函式重新定義以符合自身所需』。我常用一個淺顯的例子來說明,今天有一個父類別:Person、一個子類別:Superman,很容易看得出來Superman也是Person的一種,故Superman為了減少重複開發將直接繼承父類別的屬性跟運作。但試想今天若Person中有一個運作叫做iam()裡面定義了印出Person的動作,此時若Superman繼承他的時後,iam()也會被繼承下去,如此當別人呼叫Supermaniam()時也會印出Person。試想若你是超人你會希望只印出Person嗎,應該很不甘心吧,好不容易成為超人,當然希望能大聲說出”i am superman!!”()~~我們用下面來說明overriding的例子:

class Person {

  public void iam()

  {System.out.println(“I am a person.”);}

}

 

class Superman extends Person {

  public void iam()

  {System.out.println(“I am a Superman.”);}

}

 

Overriding最終的目的,當然是希望利用父類別來動態操作子類別的函式,以達多型的效果。我常這樣形容,當看到了inheritanceoverridingupcasting(向上轉型:指的是將子類別物件轉成父類別型態)的時候代表了程式準備要做多型了,而多型的目的當然就是要增加程式的彈性,讓相同的函式名稱在動態的階段才決定要呼叫哪一個函式,故可達到同名異式的效果。

 

Overloding注重的是不同式子共用相同的函式名稱。而Overriding後的多型重視的是相同的函式在不同的類別中會有不同的函式名稱會有不同的行為反應,並且在runtime才決定所需呼叫的行為反應。

arrow
arrow
    全站熱搜

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