2013-11-26 53 views
1

項目中有一個StoreService,它提供了一些讀取和寫入遠程數據存儲的方法。例如我應該擴展服務類還是隻使用它的一個實例?

public class StoreService { 
    public StoreService(String url, String username, String password) {} 
    public void save(String category, String key, String value) {} 
    public String read(String category, String key) {} 
} 

然後我看到有另一個UserStoreService這是項目,延伸StoreService的子模塊:

public class UserStoreService extends StoreService { 
    public UserStoreService(String url, String username, String password) { 
     super(url, username, password); 
    } 
    public void saveUserName(String userId, String userName) { 
     super.save("user", userId, userName); 
    } 
    public void getUserName(String userId, String userName) { 
     return super.read("user", userId); 
    } 
} 

你可以看到它只需添加一些方法。在這裏使用extends好嗎?

我可以使它不extends

public class UserStoreService { 
    private StoreService storeService; 
    public UserStoreService(String url, String username, String password) { 
     this.storeService = new StoreService(url, username, password); 
    } 
    public void saveUserName(String userId, String userName) { 
     storeService.save("user", userId, userName); 
    } 
    public void getUserName(String userId, String userName) { 
     return storeService.read("user", userId); 
    } 
} 

但我不知道哪個解決方案是更好的,當我應該使用extends,何時不。

回答

1

這真的取決於您的要求 - 在這些情況下沒有固有的「更好或更壞」。

了我的頭頂部,這裏有一些注意事項:繼承(第一種情形)的

優點:

  1. 您可以輕鬆地使用新的子類來代替原來的。
  2. 超類中的新方法會自動繼承,維護功能和兼容性。
  3. 方法調用不需要遵循額外的指針,所以這可以稍微快一點。

代表團(第二方案)的優點:

  1. 您可以根據需要輕鬆切換的委託對象。
  2. 超類中的新方法不會自動繼承,因此您會收到錯誤,警告您缺少子類中的功能。
  3. 超類中的新方法不會自動繼承,因此您可以避免支持您不想支持的功能。

對於這種情況下的授權,你也可以考慮擁有一個通用的超級接口,這通常會給你兩全其美。當你覺得有可以提取一些多態行爲並有確實存在的是,一個子類和超類之間關係

1

主要我們使用extends關鍵字爲開發角度提供繼承和代碼可用性。 here是針對其展示在Java

+0

代碼的可重用性不應該是擴展類的理由。 – Kayaman

2

實際使用extends關鍵字當我從你的代碼看你有沒有針對StoreService UserStoreService completelly不同的接口的一個例子。所以這是正確的方式不使用繼承(擴展),但使用組合。

1

第二個顯然更好。第一個使用繼承來重用代碼,而不是做多態的方法。應該處理用戶的UserStoreService事實上可以存儲任何其他種類的類別,因爲超類方法仍然是公開的。

這樣的設計會導致像java.util.Properties這樣的暴行,它應該只包含字符串作爲鍵和值,但不能強制執行此操作,因爲它從Hashtable擴展而不是使用一個。

+0

您可否請詳細說明_ UserStoreService應該處理用戶,實際上可以存儲任何其他種類的類別,因爲超類方法仍然是exposed_? – Yaneeve

+1

子類將方法添加到超類中,但超類方法仍然存在,因此沒有任何東西阻止開發人員執行'UserStoreService userStore = new UserStoreService(...); userStore.save(「玩具」,「樂高」,「黃色」);'。因此,UserStoreService可用於存儲玩具或任何其他類別,這是錯誤的。 –

2

使用繼承。

否則在大多數情況下喜歡在組成繼承,因爲它也限制了UserStoreService才能夠在未來擴展一些其他類的可能性。

0

我同意@Narendra Pathai的答案,但想推薦你總是寧願組成繼承除非已經有你的代碼中的情況下訪問某些對象多態會更有意義 - 說可以繪製所有這些形狀而不是預先編碼多態性(is-a關係)。

相關問題