Re: [問題] 請問interface到底是做什麼用的?
※ 引述《godfat (godfat 真常)》之銘言:
: ※ 引述《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, 那你原先物件的繼承體系怎麼辦?重寫?擺爛?
嗯...這邊我的問題是,物件的compareTo方法,可不可以直接定義在物件的class裡?
因為物件去繼承介面,也是要在自己裡面去定義方法,那為什麼不自己來呢?
從多重繼承的字面來看,應該是會使用到父母類別的方法或變數,可是介面裡寫的
東西,除了跟父母類別的方法同名以外,我不知道繼承介面可以得到父母類別的什麼
東西?而且其他不是父母類別的類別,萬一有了同樣名稱的方法,那不就變成同時也
去繼承這個第三者了?
其他幾位大大的寫法,我能理解其中的:先定義一個規範,其他要繼承這個類別的
就要去把規範的內容寫出來。就好像是體委會丟一個建立二軍的公文要求中職六隊
去建立二軍,但是體委會什麼目標、進程都沒有,要六隊自己提出建立二軍的規劃表
然後上繳體委會,所以六隊提出的內容也會不一樣,但是基本上都有依照體委會"建立
二軍"的目標去做。
可是不見得每個二軍規劃表都有像la new一樣有"球員專用餐廳"啊,如果要使用
二軍.餐廳()這個func,不就會卡住?如果中職六隊不去繼承體委會這個介面,他們也
可以不用理會建立二軍這個規範。那是什麼原因這些class必須去繼承這個介面呢?
: 然後你這一段最後一句提到其他小孩的唱歌運動是否會跟原本的一樣。
: 基本上假使你用到了動態多形機制,意思就是你不要求他們的唱歌運動
: 是否一樣了。所以這根本不是問題,反而是原則。動態多形就是要每個
: 不同的物件間行為不同而誕生的。而這個行為雖然各自不同,卻有著相
: 同的意義。比方說你要所有的小孩表達快樂,那麼有的小孩可能是唱歌,
: 有的可能是運動(好啦這是很怪啦),不管他用什麼方法表達,你的命令
: 就只是要求他表達快樂,而這也只是你想要的。反之,就不是動態多形
: 要做的事,設計方向錯誤。
: : 不好意思扯了一堆,因為我一直看不懂介面所以放棄java,沒想到又在php遇上
: : ,只好求各位幫我解惑。謝謝!
: 不懂介面的話會有很多問題喔 @_@
: 不過我個人認為多重繼承還是有必要的… Java 的介面並沒有完全解決
: 問題。至於其他的語言對於多重繼承的解法,就我所知還有 mixin,
: D 語言和 Ruby 就是以 mixin 來解決的。但不要問我 mixin 是啥,
: 還沒研究過 XD
: 順便一提,就我所知有多重繼承的是 C++ 和 Common Lisp, 其他有點忘了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.109.174.241
討論串 (同標題文章)
java 近期熱門文章
PTT數位生活區 即時熱門文章