首頁
中文書目錄
原文書目錄
 站內快速搜尋
資源中心
Book Series
Special Interest













■好消息,歐萊禮書籍已重新鋪貨至各大書局及網路書店,歡迎讀者選購       ■歡迎各院校採用歐萊禮書籍,學校團購請洽校園服務團隊

[FAQ]

Java 的介面定義(Java In a NutShell 技術手冊 第三版 )

----- Original Message -----
From: cic
To: bookquestions@oreilly.com.tw
Sent: Thursday, September 26, 2002 1:43 AM
Subject: Interface問題請教?


Java In a NutShell 技術手冊 (third edition) David Flanagan p148
我想請教
為何要定義一個介面public interface Centered 裡面包含許多"空的"方法,
然後再由實作他的類別來實作這些方法,
豈不畫蛇添足嗎?
為何需要定義一個介面,
我可以不要用介面,直接寫這些方法豈不乾淨俐落
比如說在p149頁中,我可以把implements Centered去掉,
並且直接將原本介面中的方法當作類別CenteredRectangle的方法
public class CenteredRectangle extends Rectangle{
//..同p149
}

謝謝回答..

cic


您好,
作者只是舉例介紹 interface 的語法而已。或許舉的例子不夠好,讓你感覺有點畫蛇添足。

interface 的主要用意,是用來定義同一類物件的共同要件。
也就是定義物件或類別應該具備哪些功能 (method),才夠資格成為該類物件。

假設我定義一個 "運輸工具" 介面 ( 為了避免你誤解,我用 pseudo code 寫 : )

interface 運輸工具 {
private 引擎 ( machine ) ;
private 傳動系統 ( machine) ;
private 駕駛系統 (machine );
public 容器 ( typeA, typeB, typeC ) ;
}

這表示一定有這四樣東西才算“運輸工具”。不同類的運輸工具, 這四樣東西的實作方式也不一樣,例如 :

class 公車 implement 運輸工具 {
private 引擎 ( 吃柴油的機械 ) ;
private傳動系統 ( 大輪胎 ) ;
private 駕駛系統 ( 方向盤 );
public 容器 ( 博愛座,普通座,立座 );
}

class 飛機 implement 運輸工具 {
private 引擎 ( 噴射渦輪 ) ;
private傳動系統 ( 沒羽毛的鐵翅膀) ;
private 駕駛系統 ( 操縱桿 );
public 容器 ( 頭艙,經濟艙,貨艙 );
}

現在你知道為何 interface 裡盡是一些 empty method。
因為 interface 根本不管這些 method 是怎麼做出來的,
interface 只管合格的類別應該具備哪些 method,以及這些 method 的規格。
比方說,如果你這樣實作 "腳踏車",compiler 不認為它是 "運輸工具" ,因為規格不合 :

class 腳踏車 implement 運輸工具 {
private 引擎 ( 佛山無影腳 ) ; // not "machine" )
private 傳動系統 ( 齒輪 ) ;
private 駕駛系統 (把手, 警鈴 ); // 多了一個參數
public 容器 ( 菜籃 ); // 少了兩個參數
}

interface 的好處,是保證所有同介面的類別,其用法都是相同的 :

公車 烏賊一號 = new 公車() ;
烏賊一號.容器(ㄚ匹婆,cic,閒閒美代子 );

飛機 鐵鳥二號 = new 飛機() ;
鐵鳥二號.容器(anonyHeroA,victimB,賓拉登);

在 Java core API 裡,每一個 package 都會定義一些 interface,以及實作這些 interface 的 class。
你可以看看 Sun 是怎麼做的,看久了,你就有 '感覺' 了。

林長毅 Technical Editor



----- Original Message -----
From: cic
To: Lin
Sent: Friday, September 27, 2002 12:56 AM
Subject: Re: Interface問題請教?

看完你的例子以後,還是覺得有點畫蛇添足
我可以不用interface改用以下的寫法...

class 公車 {
private 引擎 ( 吃柴油的機械 ) ;
private傳動系統 ( 大輪胎 ) ;
private 駕駛系統 ( 方向盤 );
public 容器 ( 博愛座,普通座,立座 );
}
class 飛機 {
private 引擎 ( 噴射渦輪 ) ;
private傳動系統 ( 沒羽毛的鐵翅膀) ;
private 駕駛系統 ( 操縱桿 );
public 容器 ( 頭艙,經濟艙,貨艙 );
}

而且我也可以保證其用法都是相同的 :
公車 烏賊一號 = new 公車() ;
烏賊一號.容器(ㄚ匹婆,cic,閒閒美代子 );
飛機 鐵鳥二號 = new 飛機() ;
鐵鳥二號.容器(anonyHeroA,victimB,賓拉登);

謝謝



就達到目的而言,你當然可以那樣寫,格局大小的問題而已。
事實上,Interface 的作用之一,是讓 compiler 知道如何幫你檢查你設計的 class合不合規格。

換言之,interface 本身是 programmer 提供給 compiler 的資訊,而非程式的一部份。
也就是說,Compiler 根本不會為 interface 產生任何實質程式碼。
不信,你可以把作者那幾個範例實際編譯成 .class 檔,然後將你的 "不畫蛇添足" 版本也編譯成 .class 檔,你會發現兩個 .class 檔是完全相同的。
我想,或許是這種原因,會讓你覺得界面有點畫蛇添足吧 !

Interface 的第二種作用,是讓其他 programmer 知道如何使用你設計的類別。 因為 interface 確保同界面物件有一致的行為。當其它 programmer 知道你的 class具備某界面,那麼,他對該界面的認識,也可用在你的類別上。

Interface 的第三種作用,是當成標籤。Java 最著名的標籤類別就是 Serializable。
Serializable 本身沒有規定任何 method,它唯一的作用,只是標示該類物件適不適合用在 RMI 環境而已。
也有人把我所謂的 "第三種作用" 歸類成第二種作用的其中一種特例。

沒人規定你寫的 class 一定要實作某界面。 但是如果你的 class 宣稱它實作了某界面, 那你的 class 就必須依照該界面要求的規格來寫。
同界面的類別會有相似用法,只是 "好的副作用" 之一而已,並非目的。

我先前舉的例子,重點在於那個不合格的 "腳踏車" 類別。
"腳踏車" 宣稱它具有 "運輸工具" 界面,但問題是"腳踏車" 類別本身沒依照 "運輸工具" 界面要求的規格設計, 所以 compiler 能幫我們挑出錯誤,讓你知道腳踏車應該這樣設計 :

class 腳踏車 implement 運輸工具 {
private 引擎 ( 電動馬達 ) ;
private 傳動系統 ( 齒輪 ) ;
private 駕駛系統 (把手 );
public 容器 ( 菜籃,駕駛座,後座 );
}

當然,如果你堅持原設計,那只要把 "implemet 運輸工具" 拿掉, compiler 就會讓你過關。但是這樣做表示你的腳踏車只能是腳踏車, 不能算是運輸工具。

又感到畫蛇添足嗎 ? 或許吧,等你寫過 "大程式" 之後, 你才會逐漸體會 OO 的好處,理解為何要這樣設計。 我所謂的 "大程式",是那種至少超過一萬行,而且不只你一個人寫的那種應用系統。

在沒有 OO 理論之前,最流行的是程序性語言( procedural language),像是 C, Pascal, Fortran。
用 C 寫小程式很方便,寫大程式就有點累,多人合作一起寫的時候更累 --- 甚至比全 交給同一個人寫還難。
所以後來有人提倡模組化程式設計 ( modular programming ),將程式拆成模組,好讓 多人能同寫一個程式。
雖然寫模組不難,把模組兜在一起變成程式也不難,但是寫出 "可一再使用的模組" (reuseable module) 就很難。
當一個開發團隊設計了兩三個大案子之後,會發現他們常常需要借用以前寫過的模組, 但問題是那些舊模組多半不能直接用,而必須稍加修改。
所以有人開始思考模組應該要有哪些特性,才可以達到 reuseable 的目的,而歸納出 來的結果,就是物件導向 理論(OO)。

別忘了,這本書的書名叫 <Java 技術手冊>,不是 <物件導向>。
作者在前言就開宗明義說了,他假設讀者已有 OO 的基礎。 如果你沒有 OO 的基礎,那就先囫圇吞棗,先學語法再說吧。 等你遇到困難之後,就能慢慢體會了。
或者,我還是那句老話,多看看 Java core API 吧,研究 Sun 為何要那樣設計, --- 尤其是 JDK 每次改版的 changelog --- 因為那裡面有許多 Sun 工程師曾經犯過 的錯 。

連這些超凡入聖的傢伙都會犯的錯,表示平凡的我肯定也會犯 --- 早晚而已。

林長毅


| 首頁 | 聯絡我們 |
© 2009, O'Reilly Media, Inc. Taiwan Branch