2011年3月16日 星期三

漫談物件導向(八) - 重載

重載 (Overloading) 方法

程序式程式語言之副程式 (函式) 名稱必須唯一,當我們要設計計算平均值之副程式,計算整數平均值副程式與計算浮點數平均值副程式就不能使用相同名稱。物件導向程式語言則提供重載方法機制,允許類別中的方法使用同樣名稱,只要這些方法的參數資料型態或參數個數不完全一樣即可,這樣的機制使得程式設計人員能較少苦惱於方法名稱的設計,以統一的名稱來呼叫。方法重載時會自動根據方法參數列的資料型態及參數個數的個數叫用正確的方法。

下列程式碼中,RECTANGLE類別提供了二個建構子,第一個建構子沒有任何引數,第二個建構子則使用了二個浮點類型的引數。

1.    public class RECTANGLE extends SHAPE {
2.        private float width; // 資料成員
3.        private float height;
4.        public RECTANGLE () { // 建構子
5.            height = 2.0F; // 使用預設的高度值
6.            width = 3.0F; // 使用預設的寬度值
7.        }
8.        public RECTANGLE (float h, float w) { // 建構子
9.            height = h;
10.          width = w;
11.      }
12.      public static void main(String[] args) {
13.          RECTANGLE rect1 = new RECTANGLE ();
14.          RECTANGLE rect2 = new RECTANGLE (5.0F, 10.0F);
15.     }
16.  }

對程式碼第13行而言,RECTANGLE建構子並未給定任何引數,因此會使用程式碼第4~7行的建構子。而以程式碼第14行來說,RECTANGLE建構子伴隨二個浮點引數,因此會使用程式碼第8~11行的建構子。

不管是預設建構子RECTANGLE ()或給定長寬引數的建構子RECTANGLE (h, w),其實要做的事情都類似,差別只有height及weight資料成員設定值不同而已,因此,預設建構子可改寫如下:

1.    public RECTANGLE () { // 物件建構函式
2.        this (2.0F, 3.0F);
3.   }