JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區 » Object/物件導向  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 介面的使用時機 [精華]
dupre





發文: 120
積分: 0
於 2004-04-06 00:06 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
終於搞懂了抽象的用途 就是強迫去寫方法

請問介面裡面是定義了抽象的方法
要繼承的類別 再自己去定義方法來用

既然都要自己去寫方法 那為何還需要這個介面呢?
因為有定義介面 要在類別寫方法
沒有介面 一樣要在類別寫方法

既然都要寫方法 那不是添足嗎??

我舉書中的例子 有2個類別 一個是車子 一個是飛機
坦克車繼承車子 戰鬥機繼承飛機
然後坦克車和戰鬥機都有個發射的方法

所以 作者用介面來解決

很奇怪?? 不是只要在坦克車和戰鬥機加個發射砲彈的方法就好了嗎?
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface Weapon
{
    public void shoot();
}
                                                                                
public class Tank extends Car implements Weapon  // use Weapon interface
{
    public void shoot()
    {
        System.out.println("Firing");
    }
                                                                                
}

而我想的方法是
1
2
3
4
5
6
7
public class Tank extends Car
{
    public void shoot(0
    {
        System.out.prinln("Firing");
    }
}

請問我的觀念是哪裡不通呢??
謝謝...
p.s 我是讀朱仲傑先生的書


dupre edited on 2004-04-06 13:19
reply to postreply to post
作者 Re:介面的使用時機 [Re:dupre]
Yoshi

塵世中一個迷途小書僮

版主

發文: 874
積分: 22
於 2004-04-06 00:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
dupre wrote:
終於搞懂了抽象的用途 就是強迫去寫方法

請問介面裡面是定義了抽象的方法
要繼承的類別 再自己去定義方法來用

既然都要自己去寫方法 那為何還需要這個介面呢?
因為有定義介面 要在類別寫方法
沒有介面 一樣要在類別寫方法

既然都要寫方法 那不是添足嗎??


USB介面的產品必定會做出USB接頭,那麼USB規格是不是就不用訂了?
為什麼在產品上面還要加上USB 1.x或USB 2.0 support ?
這有一種公約的感覺對吧? 我根本不用知道那產品是什麼
我只要知道它有support USB 2.0,我就可以拿來用了


reply to postreply to post
YOSHI!
作者 Re:介面的使用時機 [Re:dupre]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-04-06 02:44 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
dupre wrote:
終於搞懂了抽象的用途 就是強迫去寫方法

請問介面裡面是定義了抽象的方法
要繼承的類別 再自己去定義方法來用

既然都要自己去寫方法 那為何還需要這個介面呢?
因為有定義介面 要在類別寫方法
沒有介面 一樣要在類別寫方法

既然都要寫方法 那不是添足嗎??


這裡有一篇文章和你的觀點一模一樣。
http://www.javaworld.com.tw/jute/post/view?bid=29&id=26608&sty=3&keywords=%A4%B6%AD%B1

對於介面這觀念我已試過數次希望能傳遞給各位我個人的一些觀點(或所謂的 sense),但都失敗了。這一次我希望我可以不要再寫出經文,也不希望在 Java 新手版提到 byte code 層級的東西。

Interface,非指 Java PL 中的 interface,這觀念在 class 出現就有了,只是比較隱晦。class 本身就帶來有 Interface 這一個成分,class "定義"了一組操作(功能)也就是一份規格(介面),而 class 本身也帶有"實做"(Implementation)的成分在裡頭,往往一般人都只注意到某個 class 有"實做"某些功能這一點,或許比較有 sense 的人會說某 class "是"某種東西,其實應該說某 class 是某種規格的實做品。

透過 inheritance,比如 B extends A,B 因此成為與 A 同規格的東西,的確是,但更準確的來說 B 是 A 這種成品的擴充物,B 一定有 A 所有的功能(也許有些功能的行為改變了)與包袱,具體來講就是:B 或許比 A 還好用(功能更多)但一定比 A 難以攜帶(A 這麼大一個,B 更大),花費的成本也較高。也因為這樣 Java 拿掉了 multi-inheritance capability,把一個蜘蛛人和蝙蝠俠的泥公仔揉在一起重新造成一個會吐絲的類蝙蝠人,你很難不做成像綠巨人浩克那般大的 size。

當一個 class 退化成沒有任何 concrete method 時(pure abstract class),你的注意力就會轉到 class 所帶來的 Interface,但光只是有 pure abstract class 來表達 Interface 這一觀念還不夠,導因於 Java PL 對 multi-inheritance 的不支援,單只有 concrete class 與 pure abstract class 兩者(還記得前者包含有 Implementation 與 Interface 而後者只有 Interface?),就會落到你提出的下場,我幹嘛寫一個只有空殼的 pure abstract class 然後待要使用時再去寫一個實做品,我直接把實做部分寫在 class 就好了,在這種情景下的確是這樣。Java 明白點出 Interface 這一個部分的概念引進了 interface,其所表達的概念就是 pure abstract class 所有的,只是 interface 可以多重實現(implements),一個東西本來就可以是多種規格合一的成品,如果要依靠 multi-inheritance 來達到這種效果,就像是把一台 Palm 和一支手機綁在一起,他可以做 Palm 能做的事(當然囉)也能當作手機來講,但事實上一台 Handspring Visor(Palm) 透過 springboard 插上 GSM 模組就是一台有通訊能力的 Palm,不需要像前者那樣做,搞的要兩顆電池,有了兩個 LCD 螢幕(以前真的有這樣的作法,把 Palm 以傳輸線接上手機)。

現在要進入你提到的問題『抽象的用途 就是強迫去寫方法』,不是的,implements 代表的事一種保證(宣言),今天你生產一台配備 150 萬畫素的 CCD 的數位相機,你就得在產品包裝上標示 1.5M,而不能因為你的相機韌體可以 postprocess 把取得的影像以演算法去搞出長寬各增加一倍的畫面,然後就大喇喇地在包裝上寫 6M,編譯器就像消基會或公平交易委員會(這我不清楚或許說錯了)要做把關的動作,你宣示了你有某規格(interface),編譯器就要盯著你做出來;反過來說,你不是因為要在包裝上印 6M 才心不甘情不願地讓你生產的相機 ship 6M CCD,而是你就是想要生產 6M 的相機,你做到了,你可以正大光明地在包裝標上 6M。有一點你要了解的是:一個宣示 implements 某 interface 的 class 確實是可以不實做 interface 所列的操作(method),就像不肖的商人,你在編譯時都還不能發現,只有在執行時才會知道(買回去使用才知道被騙了)。

有了 interface 讓程式設計者可以更精確地表達所要的東西,我就是要某種規格的東西。使用 interface 當參數或變數的型態就像是:我要一個 15 pin 轉 9 pin 的東西,你可以拿鉗子給我把 15 pin 拔的剩 9 pinStupid;使用 class 當參數或變數的型態則是:我拿著一條 15 pin 轉 9 pin 的轉接線說我要這樣的東西,那麼你拿給我的就是這樣的一條轉接線,或許是三頭龍,一頭是 25 pin 的多用轉接線。


Duncan edited on 2004-04-06 02:59
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:介面的使用時機 [Re:dupre]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-04-06 02:50 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
dupre wrote:

作者用介面來解決

很奇怪?? 不是只要在坦克車和戰鬥機加個發射砲彈的方法就好了嗎?
1
2
3
4
5
6
7
8
9
10
11
12
public interface Weapon
{
    public void shoot();
}
 
public class Tank extends Car implements Weapon // use Weapon interface
{
    public void shoot()
    {
        System.out.println("Firing");
    }
}


而我想的方法是
1
2
3
4
5
6
7
public class Tank extends Car
{
    public void shoot()
    {
        System.out.prinln("Firing");
    }
}



反問你,今天我要你提供一個 method 是:我給你一個可以攻擊的東西(actual argument),你幫我操作(shoot) 去反擊,那麼你要怎麼寫讓我可以,給你坦克也好戰鬥機也好,你都能完成任務?難道你一定得準備兩個對應的 method 才行(一個操作戰機,一個操作坦克?),今天我又買了 ICBM,你又該如何?


Duncan edited on 2004-04-06 03:01
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:介面的使用時機 [Re:dupre]
felixjen





發文: 18
積分: 0
於 2004-04-06 11:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
阿媽不會用電視遙控器,他打電話問他孫子。他孫子想了一下說,「你有沒有看到有一個紅色的按鈕,上面寫『電源』?把他按下去就好了。」

因為我們已經習慣了,遙控器上一定有一個「紅色的電源按鈕」當作開啟電視機的「介面」。因此無論你拿到什麼遙控器,總是可以輕而易舉的打開電視。這就是介面的威力。如果沒有介面做約束,有人寫電源,有人寫開關,還有人搞不好寫啟動。有紅色,綠色,藍色,還有七彩霓虹燈的,這樣不就麻煩了。孫子還能只透過電話就教會阿媽嗎?

寫坦克車的跟寫大砲的不一定是同一家公司,要是沒有一個約束,可能有人寫shoot(),有人寫fire(),有人寫killThemAll(),那不是天下大亂了。

再比方講,明明講好都是shoot(),小王偏偏沒睡醒,打成了shooot()。要是有介面機制,他就會在編譯期間發現錯誤,否則還是會編譯成功,然後一旦上戰場,這子彈可是打不出來的。

介面可以讓所有人依循一樣的「名稱」完成一個工作,這可以確保同一種類的物件有一模一樣的操作方式。所以,很重要。^_^


felixjen edited on 2004-04-06 11:34
reply to postreply to post
作者 Re:介面的使用時機 [Re:dupre]
dupre





發文: 120
積分: 0
於 2004-04-06 12:12 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝Duncan and felixjen 大大 在這麼晚的時候
還幫小弟解惑 原來介面就是統一的規格
這我是了解的 只是一直不懂得用與不用的差別

因為implement 之後 還是要去寫方法
現在提出我看了大大們的指導之後的見解 :

自己一人寫的東西 用不用介面都可以 因為是自己一人規劃的
但是如果要和大家一起合作寫程式的話 就需要用到介面
因為有了統一的介面 大家分工之後的時候 要呼叫什麼的都很方便..

是這樣子嗎 ? 因為我自己練習的小程式 都看不出來差別在哪
應該是團隊才用的上吧....

"反問你,今天我要你提供一個 method 是:我給你一個可以攻擊的東西(actual argument),你幫我操作(shoot) 去反擊,那麼你要怎麼寫讓我可以,給你坦克也好戰鬥機也好,你都能完成任務?難道你一定得準備兩個對應的 method 才行(一個操作戰機,一個操作坦克?),今天我又買了 ICBM,你又該如何? "
這是Duncan大大給小弟的問題 我試著回答...
如果是我自己一人寫的話 我不用介面 因為 自己最清楚如何呼叫
如果和另外的朋友各寫一個類別的話呢 就要介面了
如果不統一介面的話 也就是不用預設的shoot()這個名稱
那他有他的方法名稱 我有我的名稱 以後無論是維護或是發展都很麻煩!!

如有錯誤 還請大大指點 謝謝^^


reply to postreply to post
作者 Re:介面的使用時機 [Re:Yoshi]
dupre





發文: 120
積分: 0
於 2004-04-06 12:18 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Yoshi wrote:
USB介面的產品必定會做出USB接頭,那麼USB規格是不是就不用訂了?
為什麼在產品上面還要加上USB 1.x或USB 2.0 support ?
這有一種公約的感覺對吧? 我根本不用知道那產品是什麼
我只要知道它有support USB 2.0,我就可以拿來用了


假設USB介面有2個方法 要設計的廠商 就用同樣的方法名稱去設計
雖然各家的程式碼未必相同 但是都可以達到類似的功能

是不是像手中的2鍵滑鼠依樣 左鍵是點選 右鍵是取消
而做滑鼠的公司多的鼠不清 但是那不重要 因為介面就是2個
廠商依照2鍵滑鼠的介面去設計 使用者也不會有使用上的問題
因為 以前的滑鼠是這樣用 現在新買的滑鼠也是這樣用
以後買的滑鼠也是這樣用 ....
不知道這個觀念正確嗎? thanks....


reply to postreply to post
作者 Re:介面的使用時機 [Re:dupre]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-04-06 13:37 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
dupre wrote:
"反問你,今天我要你提供一個 method 是:我給你一個可以攻擊的東西(actual argument),你幫我操作(shoot) 去反擊,那麼你要怎麼寫讓我可以,給你坦克也好戰鬥機也好,你都能完成任務?難道你一定得準備兩個對應的 method 才行(一個操作戰機,一個操作坦克?),今天我又買了 ICBM,你又該如何? "
這是Duncan大大給小弟的問題 我試著回答...
如果是我自己一人寫的話 我不用介面 因為 自己最清楚如何呼叫
如果和另外的朋友各寫一個類別的話呢 就要介面了
如果不統一介面的話 也就是不用預設的shoot()這個名稱
那他有他的方法名稱 我有我的名稱 以後無論是維護或是發展都很麻煩!!


No,我強調的不在於 interface 可以訂出統一的規格有助於合作或維護,而是:interface 的使用是用抽象化的觀點來設計程式,增加程式的彈性。而實際上 class 也有 interface 的成分在裡頭,特別是當 class 退化成 pure abstract class 就等於是 interface,只是 class 在繼承上有限制,請思考一下這些觀念,不要為 interface 而 interface,也不要把 interface 看成是一種特殊的機制非得有他才能做到什麼事。

現在,請看看下列的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public interface Weapon {
  public void attack();
}
 
public class Tank implements Weapon {
  public void attack()
  {
    aimTarget();
    fireCannon(some_ammo);
  }
  
  proteted void aimTarget(){...}
}
 
public class BattlePlane implements Weapon {
  public void attack()
  {
    depart();
    Objective target = searchTarget();
    if (lock(target))
      fireMissile(aMissile);
  }
  
  protected void depart(){...}
  protected Objective searchTarget(){...}
  protected boolean lock(Objective target){...}
  protected void fireMissile(Missile m){...}
}
 
public class ICBM implements Weapon {
  public void attack()
  {
    setDestination(Point dest);
    launch();
  }
  
  protected void setDestination(Point dest){...}
  protected void launch(){...}
}
 
public class WeaponConsole {
  public void openFire(Weapon w)
  {
    w.attack();
  }
}


以及:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Tank{
  proteted void aimTarget(){...}
}
 
public class BattlePlane implements Weapon {
  protected void depart(){...}
  protected Objective searchTarget(){...}
  protected boolean lock(Objective target){...}
  protected void fireMissile(Missile m){...}
}
 
public class ICBM implements Weapon {
  protected void setDestination(Point dest){...}
  protected void launch(){...}
}
 
public class WeaponConsole {
  public void openFireUsingTank(Tank tank)
  {
    tank.aimTarget();
    tank.fireCannon(some_ammo);
  }
  
  public void openFireUsingBattlePlane(BattlePlane plane)
  {
    plane.depart();
    Objective target = plane.searchTarget();
    if (plane.lock(target))
      plane.fireMissile(aMissile);
  }
  
  public void openFireUsingICBM(ICBM m)
  {
    m.setDestination(Point dest);
    m.launch();
  }
}


即使在二例中,你有為每一種攻擊性武器定義與實做 attack 操作,你還是免不了要針對不同的武器提供不同的 method 來使用對應的武器。現實情況也是這樣,不同的武器有不同的操作方式與流程,但是對一個作戰指揮者來說,他只要一道命令"給我開火",各軍種單位的士兵就應該要能利用現成的武器依照適當的手續來動武,而不是"那個坦克給我轟" "戰鬥機升空攔截" "發射洲際彈道飛彈" 等等來一一吩咐。

你如果為 Tank/BattlePlane/ICBM 抽出共同的 base class Weapon,你也可以寫成例一的形式,但缺點是:當你要設計同樣擁有砲擊能力的戰艦,你可能得重新實做出來,你認為 Tank 本身就有砲擊的介面(如果你當初是這樣設計),你應該可以讓戰艦 extends Tank,免不了的你的戰艦就會有兩條多餘的履帶,而且戰艦極可能已經 extends 船,你就無法透過繼承來為戰艦添加不同的介面(規格)與實做,透過 interface 你還是得實做,但至少可以增添介面。


Duncan edited on 2004-04-18 01:19
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:介面的使用時機 [Re:dupre]
dupre





發文: 120
積分: 0
於 2004-04-06 23:54 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝大大如此詳細的解說
我開始有點了解了

Java的觀念真的是比較難阿 比起以前的結構化設計...


reply to postreply to post
作者 Re:介面的使用時機 [Re:dupre]
anki630

Woodstock



發文: 33
積分: 2
於 2004-04-07 23:09 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
因為我個人有體會了一些東東
也許提出來給大家參考看看(觀念是一樣的)
我在這裡再舉個例子,或許會比較好了解

首先,我將會定義一個interface與一些class

1
2
3
4
5
interface 汽車操作介面{
    void 油門(){}
    void 剎車(){}
    void 方向盤(){}
}

以下是一些車子的class,這些車子都implements汽車操作介面
因為每輛車的結構不同,所以對於汽車的操作介面的設計方法也不同
雖然所要達到的功能名稱都相同,但我們還是要一一的設計
1
2
3
4
5
6
7
8
9
10
11
class Ford_Escape implements 汽車操作介面{
    void 油門(){
        //針對Escape詳細的加油方法
    }
    void 剎車(){
        //針對Escape詳細的剎車方法
    }
    void 方向盤(){
        //針對Escape詳細的轉動方向盤方法
    }
}


1
2
3
4
5
6
7
8
9
10
11
class Honda_CRV implements 汽車操作介面{
    void 油門(){
        //針對CRV詳細的加油方法
    }
    void 剎車(){
        //針對CRV詳細的剎車方法
    }
    void 方向盤(){
        //針對CRV詳細的轉動方向盤方法
    }
}


1
2
3
4
5
6
7
8
9
10
11
class NISSAN_X_TRAIL implements 汽車操作介面{
    void 油門(){
        //針對X_TRAIL詳細的加油方法
    }
    void 剎車(){
        //針對X_TRAIL詳細的剎車方法
    }
    void 方向盤(){
        //針對X_TRAIL詳細的轉動方向盤方法
    }
}


現在我再定義一個Anki的class //anki是一個人,他會開車。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Anki{
    //假設anki的開車方法如下
    //傳人的參數是 汽車操作作面
    //也就是說,如果你要叫anki開車,只要你把有implements汽車操作介面
    //的車給我,我就能夠開這輛車
    public void 開車(汽車操作作面 car_interface){
        car_interface.油門();
        car_interface.方向盤();
        car_interface.剎車();
    }
    public static void main(String [] args){
        Anki anki=new Anki();
        anki.開車(new Honda_CRV());
        anki.開車(new Ford_Escape());
        anki.開車(new NISSAN_X_TRAIL());
    }
}

從上面的例子來看,雖然每輛車都不一樣,但是它個都有汽車的操作介面
不管你給anki的是什麼車車,只要有了這個介面(汽車操作介面),
anki都能把車車開得很順暢(也就是能夠讓車子行駛)

那在Java裡有沒有例子呢?
有的,以下就是一個很好的例子:

Shape是一個interface
而目前有implements的class有Area, CubicCurve2D, GeneralPath, Line2D, Polygon, QuadCurve2D, Rectangle, RectangularShape
從字面上的意思來看,上面的class都是一些有implements Shape這個interface

在Graphics2D這個class有這麼一個method:
abstract void draw(Shape s)
也就是說只要你給我一個Shape不管是什麼圖形我都能夠將它畫出,
而不需要管這些Shape是什麼樣的class
換句話說,只要是有實做出Shape這個interface的class我都能多畫出。

這樣是不是非常方便呢?
^^


anki630 edited on 2004-04-08 09:50
reply to postreply to post
作者 Re:介面的使用時機 [Re:dupre]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-04-08 01:16 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
有個簡單的方法∼∼
寫一個有圖形介面的程式∼∼
程式中不要實作任何 interface
把 JDK 中原來有的 interface 都包成 abstract class 之後再使用

你就會發現沒有了 interface 之後會有多不方便


reply to postreply to post
請養成良好的 Java 程式碼慣例 習慣
作者 Re:介面的使用時機 [Re:dupre]
dupre





發文: 120
積分: 0
於 2004-06-19 17:24 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我最近看到 awt的內容 正在學window 的event
對於介面有了新的體會 再次提出 不知道對不對...

一般來說 視窗都有的縮小 放大 和關閉的三個功能
而在 java.awt.event 裡面 的 WindowEvent有 7個方法
但是全部都為介面 因此我必須去實作他

不管我的內容怎麼寫 使用者只要看到 視窗上的x 就知道是關閉
只要看到 _ 就知道是縮小 .....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   class WindowEventDefine implements WindowListener
{
  public void windowClosing(WindowEvent e)
  {
    System.out.println("This frame will be closed...");
    System.exit(0);
  }
  
  public void windowIconified(WindowEvent e)
  {                   
    System.out.println("Size down..");
  }
  
  public void windowClosed(WindowEvent e) {}
  public void windowOpened(WindowEvent e) {}
  public void windowDeiconified(WindowEvent e) { System.out.println("Size up..");}
  public void windowActivated(WindowEvent e) {System.out.println("Actived..");}
  public void windowDeactivated(WindowEvent e) {System.out.println("Deactived....");} 


每個方法裡面 個人完成的內容不一定一樣 但是只要達到大家的共識
是縮小 是關閉 是放大的功能 就可以了

不知道 我這樣的想法 正確嗎?


reply to postreply to post
作者 Re:介面的使用時機 [Re:Yoshi]
naive231





發文: 11
積分: 0
於 2005-07-20 21:18 user profilesend a private message to usersend email to naive231reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不好意思,我也是一個不懂介面用途的朽木…Sad

就算我沒有實作USB2.0的Interface,但是只要我的類別中,都有和USB2.0的Interface所宣告的方法一模一樣的方法,我也一樣具有USB2.0的功能,甚至用同樣(同名稱)的方法呼叫任何方法也是相容的,不是嗎?

介面只是用來規定類別的名稱用的嗎?


reply to postreply to post
作者 Re:介面的使用時機 [Re:Duncan]
naive231





發文: 11
積分: 0
於 2005-07-20 21:25 user profilesend a private message to usersend email to naive231reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我一直在想…如果戰鬥機也要shoot(),坦克也要shoot(),他們當然是同一個介面出來的。但是我如果也對ICBM類別加入一個shoot(),那麼使用方法是一樣的,只是有沒有「宣稱」是實作同一個介面出來的差別,那意思就是說Interface充其量只是一個"名稱規格"囉?

reply to postreply to post
作者 Re:介面的使用時機 [Re:felixjen]
naive231





發文: 11
積分: 0
於 2005-07-20 21:32 user profilesend a private message to usersend email to naive231reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
介面也有可能會誤導。Shock

寫坦克的和寫大砲的因為不一定是同一家公司,所以即使用Interface來約束也不見得有用。寫大砲的可能很單純就寫個shoot()來開砲,因為它也只會"開砲"。但是寫坦克的可能有搭配機鎗及主炮,他可能覺得shoot()是指機鎗開火(如果shoot()只要求傳入座標,而且不會傳回值的話…),然後把坦克開炮寫成fire()。

介面真的能讓大家都會用搖控器嗎?很抱歉,有個搖控器的確實作了一個紅色的按鈕,但是這顆鈕按下去並不會有任何作用,因為那是錄放影機的搖控器,紅色按鈕是「錄影」的意思。


reply to postreply to post
作者 Re:介面的使用時機 [Re:anki630]
naive231





發文: 11
積分: 0
於 2005-07-20 21:52 user profilesend a private message to usersend email to naive231reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
有個問題,如果有台車必須先解開電子鎖才能開,假設叫做FunnyCar好了,這個類別一樣乖乖的實作了「汽車操作介面」的所有東西。只不過當你把FunnyCar丟給Anki,叫他「開車」的時候…

很抱歉,所有的車他都能開,就是FunnyCar不行。為什麼不行?因為他只照著"介面"告訴他的,車車拿來,油門踩下去就會跑,方向盤可以控制方向,剎車用來把車停下來(這些還不一定都對,前提是FunnyCar沒有把「油門」及「剎車」的意思搞反…),但是"介面"並沒有告訴他要先看看有沒有電子鎖,有的話要先打開才能開。

就算沒有「電子鎖」這種東西好了。FunnyCar就是與眾不同,它的「方向盤」是和飛機搖桿同等級的,把方向盤向上拉就會加油,向下壓就會減速。Anki在開這種車的時候,可能會把車車拿去撞樹吧?然後他可能會懷疑:奇怪,難道我開車技術還學得不夠好嗎?不是的…只是因為FunnyCar不是光看"長相"就知道怎麼開的。

我總是覺得,介面這種東西如果拿來統一名稱,一樣會有很多問題。常常在實作中,我就是需要戰鬥機「發射飛彈」,但是我也要讓坦克和戰鬥機一樣的「發射飛彈」(我的坦克上面有飛彈,不行嗎?),難道我還要把戰鬥機的程式碼Copy過來一份,或是坦克要發射飛彈時,「偷偷」地叫戰鬥機來發射飛彈(臨時產生一個戰鬥機物件)嗎?

我實在是不懂介面啊~~~~


reply to postreply to post
作者 Re:介面的使用時機 [Re:dupre]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2005-07-20 22:29 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
寫一大堆描述。。。模糊焦點。。。不如看幾個範例比較快懂啦。。。

http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/InterfaceType.htm

多看幾個Pattern慢慢去體會。。。
http://caterpillar.onlyfun.net/Gossip/DesignPattern/DesignPattern.htm


reply to postreply to post
良葛格學習筆記
作者 Re:介面的使用時機 [Re:dupre]
naive231





發文: 11
積分: 0
於 2005-07-26 17:54 user profilesend a private message to usersend email to naive231reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不好意思,剛剛才看到回答,我看了範例(第一個,因為UML不太熟…),有一些問題。
其實Interface的使用我是瞭解的,我不瞭解的是應用上的意義。我絕對肯定Interface有管理規格上的好處,我只是不完全瞭解它在實際應用上的盲點。

範例中Test類別裡的doRequest()只接受IRequest介面的東西。OK,這沒問題。但是如果HelloRequest及WelcomeRequest都沒有實作IRequest這個介面(所以他們都是Object物件),而我把doRequest修改成只要接受Object型態的參數就行的話:public static void doRequest(Object request)

我想這個程式應該還是正常的。doRequest()的內容甚至不用修改,因為兩個class都有一個execute()讓它使用。

我不懂,Interface怎麼看都只有"管理"使用介面的問題,至於之前大家提的,什麼多重繼承啦,還是什麼功能抽象化啦,不都是同一件事嗎?今天就算沒有Interface,大家只要在函式命名及用途上取得共識就好啦。就算有了Interface,只要實作的Class用途搞錯,就算是同Interface的東西也不能保證程式碼不用修改啊?多重繼承的問題,沒有就是沒有啊,就像我之前提的例子,坦克想要發射飛彈,而且要像戰鬥機一樣的飛彈,可是因為它沒有繼承戰鬥機,所以除非它自己架一個飛彈發射的函式,不然他能做的,就是請戰鬥機來幫它發射飛彈(臨時宣告出一台戰鬥機)。

不曉得是不是還有更決定性的例子呢?不好意思打擾各位了。


reply to postreply to post
作者 Re:介面的使用時機 [Re:naive231]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2005-07-26 18:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
naive231 wrote:
我想這個程式應該還是正常的。doRequest()的內容甚至不用修改,因為兩個class都有一個execute()讓它使用。


您想?。。。只是用想像的。。。?什麼叫「我這個程式應該還是正常的」?。。。何不自己試著編譯看看會不會過?。。。空想不如動手作。。。

改成Object就好?doRequest()的內容不用改?。。。Object型態的名稱怎麼會知道傳入的物件有定義execute()方法。。。Dead


caterpillar edited on 2005-07-26 18:40
reply to postreply to post
良葛格學習筆記
作者 Re:介面的使用時機 [Re:naive231]
阿刃

生活就像 RPG



發文: 121
積分: 3
於 2005-07-26 19:10 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
naive231 wrote:
恕刪..

多重繼承的問題,沒有就是沒有啊,就像我之前提的例子,坦克想要發射飛彈,而且要像戰鬥機一樣的飛彈,可是因為它沒有繼承戰鬥機,所以除非它自己架一個飛彈發射的函式,不然他能做的,就是請戰鬥機來幫它發射飛彈(臨時宣告出一台戰鬥機)。


= =||坦克本來就不是一種戰鬥機....你要他怎麼發像戰鬥機一樣的飛彈啦XD
((別打我))

回題..硬要這樣講其實也沒人能講些什麼...重點是要在溝通之後有學到東西..老是覺得別人講的不對沒道理@@永遠學不會的...

今天有一個CLASS是戰鬥機...實作了weapon的介面...
而weapon的介面裡面有一個叫做飛彈發射的方法...
然後..又有一個叫做坦克的CLASS...繼承了戰鬥機這個類別...
好了=.=達到上述的功能了....
坦克可以發射跟戰鬥機一樣的飛彈...只要別去覆寫飛彈發射的方法..
當然..就算覆寫了戰鬥機的飛彈發射..一樣有辦法發射跟戰鬥機一樣的飛彈

只要把坦克cast為戰鬥機..就可以發射戰鬥機時才能發射的飛彈...
不過沒有實作weapon的坦克就因此沒辦法cast為weapon

只是這樣真是不符合OO的概念=.=很不合理~"~坦克怎麼會是戰鬥機的一種..
若在機器人變身之類的遊戲情境中...那我就不否認XD~
原本就不一樣的東西...硬要做一樣的事情...
乾脆重寫一次不是比較好~搞什麼繼承OOXX


阿刃 edited on 2005-07-26 19:28
reply to postreply to post
A never ending story with Java...

My blog => 【刃™】ThiS WORLD, MY WORLD
作者 Re:介面的使用時機 [Re:naive231]
阿刃

生活就像 RPG



發文: 121
積分: 3
於 2005-07-26 19:39 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
naive231 wrote:
不好意思,我也是一個不懂介面用途的朽木…Sad

就算我沒有實作USB2.0的Interface,但是只要我的類別中,都有和USB2.0的Interface所宣告的方法一模一樣的方法,我也一樣具有USB2.0的功能,甚至用同樣(同名稱)的方法呼叫任何方法也是相容的,不是嗎?

介面只是用來規定類別的名稱用的嗎?


不是耶..有種情況你自認的USB2.0會不能用...

假設有一個有一個MP3隨身聽實做了USB2.0界面...
而USB2.0裡面有一個方法叫做傳輸...

你自認的USB2.0裡面也有一個方法叫傳輸...

現在必須要插到電腦的USB2.0插槽中...電腦有一個方法叫做建立USB傳輸..
但是這個USB傳輸必須丟USB2.0的物件進去..

可是阿~你自認的USB2.0沒辦法CAST變成USB2.0的物件...
因為電腦不認識你認為能達到跟USB2.0相同功能的USB2.0...
所以沒辦法跟電腦建立USB傳輸..

而MP3隨身聽因為有實做USB2.0的界面就可以..

一堆USB~看了頭都暈~XD


reply to postreply to post
A never ending story with Java...

My blog => 【刃™】ThiS WORLD, MY WORLD
作者 Re:介面的使用時機 [Re:阿刃]
阿刃

生活就像 RPG



發文: 121
積分: 3
於 2005-07-26 19:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
某種層面來說...interface確實就是名稱規格...
因為真的就只有宣告名稱...
卻沒有任何的實做在裡面...

當然...也許有人覺得介面沒什麼用處...
可以用別種方式去替代...

事實上也是如此~沒有人硬性規定寫程式一定要用到介面...
用介面有用介面的寫法...不用介面有不用介面的寫法...

只是剛好JAVA程式語言本身..
提供了這樣的方式讓程式設計師可以運用..

至於用不用...怎麼用...都看個人了...

附帶一提...如果某介面定義了shoot是要發射大砲時..
大家都遵循此介面shoot就是要發射大砲的意思...
忽然有個人實做了這個介面..硬是把shoot實作成發射機槍..
另外自己寫了一個fire才是發射大砲
你說這個人機不機車= =+

而且要提醒開坦克的人...
每當開到的是這台很機車的坦克...
記得!!
不能依照一般武器的用法使用shoot...
而是要使用這台奇怪的坦克所提供的fire才是發大砲~

這就好像沒人規定寫中文一定要由上往下寫...
可是有個人就喜歡由下往上寫一樣=__=||
講真的...沒什麼不可以啦...
不過搞怪的結果請自行負責((EX:考試被當..程式跑出來不是你要的結果之類的))


阿刃 edited on 2005-07-26 20:41
reply to postreply to post
A never ending story with Java...

My blog => 【刃™】ThiS WORLD, MY WORLD
作者 Re:介面的使用時機 [Re:dupre]
earow

Anti M$



發文: 87
積分: 1
於 2005-07-27 05:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我也來說一種
例如有一種叫做"按鈕"的interface
其中宣告了一個"按下"的abstract method
還有一個"人"的class
"遙控器"和"鍵盤"的class 實作了"按鈕"這個規格
對"人"來說
只要使用"按鈕"這個interface的method
就可以操作"遙控器"和"鍵盤"


reply to postreply to post
作者 Re:介面的使用時機 [Re:dupre]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2005-07-27 09:58 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
補充一句.

Interface 是介面, 是代表一種 "規格", 而在 java 中, 要是你 "遵行" 某規格就得提供該規格所需要的 method.

但相反而言並不正確. 你提供了某規格所需要的 method, 並不代表你就 "遵行" 了該 "規格"!

因為你不宣明自己是 "遵行" 某 "規格", 別人是不可能當你是符合該規格的

換成 java 的用語,
你要 implement 某 interface, 就得 implement 該 interface 所需要你 implement 的 (abstract) method.

但相反而言並不正確. 某 class 提供了某 interface 所需要的method, 並不代表該 class 就 implement 了該 interface.

因果關係該要搞清楚


reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
作者 Re:介面的使用時機 [Re:阿刃]
naive231





發文: 11
積分: 0
於 2005-07-27 15:04 user profilesend a private message to usersend email to naive231reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
所以沒錯嘛。Interface主要的用途的確就是規格的一致性?我想確認Interface的定位能用到什麼程度。

reply to postreply to post
go to first page go to previous page  1   2  go to next page go to last page
» JWorld@TW »  Java 新手區 » Object/物件導向

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8