2011年3月8日 星期二

漫談物件導向(五) - 繼承

繼承 inheritance

繼承是物件導向重要特性之一,子類別可繼承父類別中宣告為public或protected之方法。就重複使用 (reuse) 的觀點,每個子類別可reuse其父類別的資料結構與程式碼。以繼承方式定義子類別,其語法如下:

modifier class class-name extends super-name{
    declaration of data members // 資料成員宣告
    constructor // 物件建構函式
    definition of class methods // 類別方法定義
}

上述super-name為父類別名稱,若類別定義時沒有宣告類別繼承關係,Java預設新類別是繼承自『java.lang.Object』,所以下面兩行的類別定義是相同。

abstract class SHAPE{…}
abstract class SHAPE extends Object{…}

子類別除了可以使用繼承自父類別的資料成員及成員物件,當然也可宣告新的資料成員、定義新的成員方法、或覆寫 (override) 繼承自父類別的成員方法。有一點要特別注意,Java的類別繼承方式為單一繼承,所以extends關鍵字後只能接一個父類別名稱。

下列程式碼中,RECTANGLE類別繼承自SHAPE類別,並在RECTANGLE子類別中覆寫了area、perimeter及showinfo方法。RECTANGLE子類別還宣告了width及height資料成員,並在建構子中設定資料成員值。

1. public class RECTANGLE extends SHAPE {
2.     private float width; // 資料成員
3.     private float height;
4.     public RECTANGLE (float w, float h) { // 建構子
5.         height = h;
6.         width = w;
7.     }
8.     protected float area() { // 計算矩形面積
9.         return height*width;
10.   }
11.   protected float perimeter() { // 計算矩形周長
12.       return 2*(width + height);
13.   }
11.   protected void showinfo() {
12.      System.out.println("This is a rectangle");
13.   }
14. }

子類別除了繼承父類別的成員方法外,當然也可新增新自己的成員方法。在此我們在RECTANGLE類別中新增一個resize方法,程式碼如下:

1.    public void resize(float rate) {
2.        width = width * rate;
3.        height = height * rate;
4.    }