如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2005年12月11日

[觀念筆記]多型的觀念與實用範例

多型的目的在於 "實作與介面分離" ,

一般多型是應用在繼承的關係裡面, 假設甲寫好一個 Base class 給大家拿來extends , 我們拿到這個 Base class 之後,會在新的 subclass 中去 override base class 的 method ,甲寫的 base class 基本上可以被視為是一種 interface (概念上的), 其他人寫的subclass 中的 method 則是實際 implementation 的部份 (你可以假設甲的 base class 中完全沒有任何 method 的 implementation )這樣一來, 外界只需要知道 甲的 base class 中定義的 method 有那些, 不必管是如何 implement

再舉個更實際的範例, Collection 這個概念, collection 在JDK 裡面其實是個 interface, 像是 vector ,stack 這些東西都是去 implement collection 這個interface .

當我們在寫程式的時候, 可以這樣寫 :

Vector c = new Vector();

另外可能會有一個 method (別人寫的) 它的格式是這樣的

public void test (Vector c) {
......
}

別人寫的這個 method 嘗試著要把我們宣告的 vector object 當作參數傳進去, 試著想想看, 如果當有一天我們要從 Vector 改用其他的資料結構如 stack, 會付出多大的 effort ?

除了修改我們自己的 code, 我們必須去修改所有把我們的 vector object當作參數的 method ~~~

這個時候多型就派的上用場了 :-) 如果別人程式是這樣寫的:

public void test(Collection c) {
......
}

直接把最高層的 interface / class 拿來當作參數, 那麼我們要從 vector 改成stack 只要做一件事情 :

Collection c = new Stack();

就是這麼簡單,

當別人的 method 接收到 c 這個 "reference variable", c 會去自動連結對應的subclass 及其 method (或是 implement 此 interface 的 class)

也就是說, 外界的人根本不必 care 我們實作的方式改變與否, 它們只要跟 base class (interface) 溝通即可~~

如此一來便達成 "實作與介面分離" 的目的囉 ~~

另外補充一下, 所謂的 interface 是可以拿來宣告 "reference variable" 的, 也就是像 Collection c ; 這樣做,但是後面要實際 new 一個 object instance 出來, interface 就做不到了, 它雖然也是class 的一種, 但是 interface 裡面根本沒有任何實作 ~~~

所以後面應該接 implement 此 interface 之 class 的 constructor (Vector, Stack 均 implement Collection interface)

Author : Silver

沒有留言:

張貼留言

歡迎提供意見, 謝謝 (註 : 留言經過版主審核通過才會發布)