前言
相信對物件導向程式設計的人都知道,物件導向的三個特性便是:封裝(Encapsulation),繼承(Inheritance)以及多型(Polymorphism)。這三項特性也是物件導向程式設計的優勢所在。因此,要使用以物件導向為主的程式設計方式,首先就必須先了解這三個特性。本人認為這三項特性之中又以多型最為重要因此,首先就來介紹多型。
多型
所謂多型常常是繼承必然會產生的結果(雖然也可能不會產生)。假設你有一個叫做〔狗類〕的階層架構狗分為狼狗,杜賓狗,土狗(先假設狗類只有這三種狗)。這三種狗都會咬人,其咬人的方法便是它所展現出來的行為,狼狗咬人的方式可能是〔咬著不放〕;而土狗咬人的方式則是〔咬了就跑〕。不同的狗就會呈現出不同的行為,雖然〔狗類〕都會〔咬〕人,但不同的狗就會有不同的咬人方式,因此要被改寫的地方就有所不同。上面的行為,將它以C++程式表現出來就會像下面一樣:
Class 狗類 Class 狼狗 : public 狗類 Class土狗:public 狗類
{ { {
public: public: public:
virtual void 咬人(void); void 咬人(void); void 咬人(void) ;
} } }
狼狗 * a狼狗 = new 狼狗;
狗類 * an狗類 = a狼狗 ;
an狗類 -> 咬人() ;
上面這段程式碼定義了兩個類別:狗類和狼狗。其中狼狗是從狗類繼承而來,既然是由繼承而來,想當然爾:狼狗一定會咬人(因為狼狗繼承了狗類的特性),但是土狗也是從狗類繼承而來,那土狗也會咬人;二者都包含了
咬人 這種行為。前面提到:狼狗的咬和土狗的咬,二者方法不同,因此在咬人的這個
Function 一定會有所不同,也就是說在各自的程式中要各自改寫(override)它們各自的行為模式。
最後面三行所呈現的就是典型的C++程式的用法。首先先產生一個狼狗實體(其指標儲存在 a狼狗中),再產生一個狗類指標指向剛剛的狼狗物件,而狗類中的咬人這個 function 被宣告為 virtual,所以在程式的最後一行所喚起的咬人動作,實際上是指向狼狗中的 咬人 這個 function,而不是土狗的咬人。
以上的例子便是C++程式所呈現出來的多型的行為。
而所謂封裝,就是將物件的實作細節隱藏起來的一種做法。
以上的解說,不知道各位看倌了不了呢?有任何疑問都歡迎大家提出來討論!
作者:劉智漢 中華民國 八十八年 一 月 四 日