2011年3月7日 星期一

漫談物件導向(四) - 抽象類別

抽象類別

抽象類別是一種特殊的類別,當類別定義中,存在有任何抽象方法,該類別就變成抽象類別。抽象方法與一般成員方法不同,它只有定義方法的原型而沒有本體,方法的本體 (程式碼) 則是交由其子類別覆寫 (override) 程式碼內容。換言之,抽象方法表示說這個類別具別某種功能,但並未具體描述如何實作這個功能。由於抽象類別內含未實作之函式,所以不允許使用new關鍵字來產生物件實體。

舉例來說,動物都會叫 (sound),猫會喵喵叫,狗會汪汪,牛會哞吽叫換言之,每種動物叫聲並不一樣,因此不適合在動物類別中直接定義sound內容在這種情況下,可將sound方法宣告為抽象方法,也就是說,在動物類別中只能描述它具有sound方法,但不規範sound內容,而是交由動物的子類別 (猫、狗、牛) 各自覆寫sound程式碼。

抽象類別宣告時,必須使用abstract修飾字。而由於抽象方法是要由繼承的子類別覆寫方法的程式主體,所以抽象方法修飾字abstract不能同時與final、static或private修飾字合併使用。

下面程式碼定義了一個SHAPE類別,SHAPE類別內宣告了area、perimeter及showinfo三個成員方法,其中area及perimeter為抽象方法,而showinfo則有實作程式碼。

1. abstract class SHAPE {
2.   protected abstract float area();
3.   protected abstract float perimeter();
4.   protected void showinfo() {
5.     System.out.println ("This is a shape");
6.   }
7. }

SHAPE這個抽象類別規範所有幾何圖形皆應具備計算面積 (area) 與周長 (perimeter) 的功能,因為不同幾何圖形計算方式並不一樣,所以不應該在SHAPE中實作計算面積及周長的程式碼,而是交由任何繼承SHAPE的子類別各自覆寫area方法及perimeter方法