多型的目的在於 "實作與介面分離" ,
一般多型是應用在繼承的關係裡面, 假設甲寫好一個 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
沒有留言:
張貼留言
歡迎提供意見, 謝謝 (註 : 留言經過版主審核通過才會發布)