Re: [問題] 請問interface到底是做什麼用的?

看板java作者 (godfat 真常)時間19年前 (2006/04/14 04:31), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/33 (看更多)
※ 引述《kazenol (隨便啦)》之銘言: : 我找了很多資料,大致上了解的是,介面是為了解決單一繼承的問題、或是規範 : 出繼承者必須做出介面預定的規則。 : 繼承我大概了解,子類別繼承之後可以使用父類別的函式與變數。可是繼承介面 : 有什麼好處?如果這個介面規定要做一個jump,但是繼承後jump也不能用,要去 : 寫一個實際jump的方法。那我直接繼承其他類別,也是可以定義jump func,為什 : 麼要繞一圈去繼承一個沒有內容、只寫個名字的類別呢? 因為在物件導向的程式撰寫裡,我們常利用基類別或介面的變數去操作 另一個實際存在的子類別或介面實作者。但是有時候那個基類別其實不 需要做太多事情,也就是說,可能只有很少很少的 public method, 甚至是只有一個,更有甚者,這個實際存在的子類別或介面實作者, 他可能已經繼承自另一個基類別了。這時候如果我們沒有 interface 這個東西的話,就勢必得用多重繼承了。而多重繼承在物件導向中是個 爭議一直很大的東西…。也就是說 Java 利用了 interface 的機制來 解決我們對於多重繼承的需求。 : 我看過一個例子,有個父class很會運動,母class很會唱歌。但是小孩子只能繼承 : 父或母而變得不完美。所以定義一個介面包含會唱歌和會運動的抽象函式,然後由 : 小孩去實作,這樣就算多重繼承。可是第一,父類別的會運動是會講明怎麼個運動 : 法,但是介面的“會運動“,就這三個字而已,沒有說明也沒有方式。第二,這個 : 介面的會運動和會唱歌除了名稱以外,跟這對父母類別有關連嗎?? 而且其他實作 : 這個介面的其他小孩,他們的會唱歌和會運動函式會寫的一樣嗎? 這是個不好的例子…因為看不出來這樣做的用意是什麼。就拿我前幾天 在試的東西舉例好了。假設我們要寫一個泛型排序法,所謂泛型排序法 就是對任何有排序準則的東西做排序。那麼我們該怎麼知道所傳進來的 物件具有比較能力?以下是亂寫的 Java code, 不一定能跑,只是為了 呈現概念。 void sort(Comparable[] input){ if( input[0].compareTo( input[1] ) == 1 ); } 好吧,這完全不能跑 XD 我們沒辦法得知各種物件間需要用什麼方法來比較大小。比方說二個 個人資料,我們應該怎麼去比較他們之間的順序?是看名字呢,還是 看編號?也就是說,我們完全沒有必要去規範 compareTo 應該怎麼 實作。更有甚者,因為 Java 沒有多重繼承,如果你讓你的物件去 繼承了 Comparable, 那你原先物件的繼承體系怎麼辦?重寫?擺爛? 然後你這一段最後一句提到其他小孩的唱歌運動是否會跟原本的一樣。 基本上假使你用到了動態多形機制,意思就是你不要求他們的唱歌運動 是否一樣了。所以這根本不是問題,反而是原則。動態多形就是要每個 不同的物件間行為不同而誕生的。而這個行為雖然各自不同,卻有著相 同的意義。比方說你要所有的小孩表達快樂,那麼有的小孩可能是唱歌, 有的可能是運動(好啦這是很怪啦),不管他用什麼方法表達,你的命令 就只是要求他表達快樂,而這也只是你想要的。反之,就不是動態多形 要做的事,設計方向錯誤。 : 不好意思扯了一堆,因為我一直看不懂介面所以放棄java,沒想到又在php遇上 : ,只好求各位幫我解惑。謝謝! 不懂介面的話會有很多問題喔 @_@ 不過我個人認為多重繼承還是有必要的… Java 的介面並沒有完全解決 問題。至於其他的語言對於多重繼承的解法,就我所知還有 mixin, D 語言和 Ruby 就是以 mixin 來解決的。但不要問我 mixin 是啥, 還沒研究過 XD 順便一提,就我所知有多重繼承的是 C++ 和 Common Lisp, 其他有點忘了 -- Nobody can take anything away from him. Nor can anyone give anything to him. What came from the sea, has returned to the sea. Chrono Cross -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.210.113
文章代碼(AID): #14FhKv2X (java)
討論串 (同標題文章)
文章代碼(AID): #14FhKv2X (java)