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

» JWorld@TW » Software Design » Effective Java  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 [Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承
metavige

metavige

版主

發文: 2133
積分: 10
於 2004-05-26 22:16 user profilesend a private message to usersend email to metavigereply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
除非專為繼承而設計並提供文件,否持不要使用繼承
這是這個條款開宗明義的一句話,也說明了繼承這件事情是必須要特別被注意的.....

首先,這樣的class必須提供文件,準確描述覆寫(overriding)任何函式的效果。換句話說,class必須說明他對於可被覆寫函式(overridable methods)的自用(self-use)程度。
為了詳細說明一個class,使他得以被安全地subclassed,你必須描述其實作細節。


為了繼承而進行的設計,不僅只是加上自用(self-use)形式的詳細文件而已。class必須審慎挑選要做為內部活動互動的protected函式,這被稱為hook。

當你針對繼承設計出一個可能被廣泛使用的class時,你應該意識到你是對文件中說明的自用(self-use)形式承擔了一份永久的義務,也是一種承諾,這些承諾會影響後續版本可能會很難提升class的效率或功能。

class還必須遵守一些限制規定,才能被用於繼承機制:無論直接或間接,建構式絕對不能呼叫可被覆寫函式(overridable methods)。
舉個例子:
1
2
3
4
5
6
7
8
public class People {
  public People() {
    showName();
  }
  public void showName() {
    System.out.println("I don't know.....");
  }
}

當我去覆寫showName(),就會發生問題.....
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Man extends People {
  private final String name;
  public Man() {
    this.name = "metavige";  
  }
  public showName() {
    System.out.println(this.name);
  }
  public static void main(String[] args) {
    Man metavige = new Man();
    metavige.showName();
  }
}

這樣showName()就會被呼叫兩次,而第一次呼叫的時候,name還未被設定∼

Cloneable & Serialiable 這兩個介面給繼承設計帶來了特別的困難。
因為clone() & readObject()的行為很像建構式,因此受到同樣的約束:無論直接或間接,clone() & readObject()絕對不能呼叫可被覆寫函式(overridable methods)。


其實,為了繼承而設計的class必須要很小心,因為可覆寫的機制,很容易因為覆寫,導致subclass的邏輯性發生問題,所以解決這類方法的最好辦法是:
對於那些並非「專門為了被安全地子類別化(subclassed)並攜帶相關文件」的class,禁止對他進行子類別化。


審慎的決定為了繼承而設計的class之實作細節,會對以後的實作發展有很大的影響。
像是最近因為專案的關係,有了設計相關class的機會,第一個subclassed的class出現的時候,並不會有太大的感覺,但當第十個、第一百個class出現的時候,就會有很深刻的體認,尤其是在團隊開發的時候,影響尤其深刻。


reply to postreply to post
請各位新手參考 論壇規範Java 新手 FAQ
話題樹型展開
人氣 標題 作者 字數 發文時間
7610 [Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 metavige 1621 2004-05-26 22:16
6548 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 221 2004-05-26 22:37
6630 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 ingramchen 569 2004-05-26 23:29
6653 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 699 2004-05-27 00:44
6795 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 Yoshi 1892 2004-05-27 02:47
6551 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 1172 2004-05-27 04:59
6443 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 giraffe 207 2004-06-18 11:21
6510 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 ingramchen 1349 2004-06-18 15:03
6318 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 648 2004-06-18 17:36
6464 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 ingramchen 443 2004-06-18 19:49
6989 Re:[Effective Java] 條款 15 : 除非專為繼承而設計並提供文件,否則不要使用繼承 plutotw 263 2004-06-18 20:51
» JWorld@TW »  Software Design » Effective Java

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

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8