2013-03-20 48 views
3

我創建了一個名爲Base有,因爲我想在我的系統中的所有對象,有一個存儲UUID一個字段類添加字段。我還希望在可以存儲在數據庫中的所有對象上都有一個名爲id的字段。我不會將它添加到Base,因爲我的域圖層中的所有對象都不會被保存到數據庫中。我可以創建另一個繼承自Base的類,並添加此字段,然後讓所有需要同時從中繼承的類。使用繼承在我的領域層

它應該儘量避免創建hieracies其存在添加這樣的字段的目的是什麼?有更好的選擇嗎?

+2

你可能會選擇使用接口,並且需要一個'getUUID()'方法(和一個'getDatabaseId()'方法用於DB序列化對象) – Wug 2013-03-20 22:06:35

+0

但是,如果equals和hashCode是基於UUID,那麼我就需要這個類的,我也希望有一個'是否新款()對於有'id'現場檢查它是否已經保存到數據庫中的所有對象'方法。 – LuckyLuke 2013-03-20 22:16:45

回答

3

因爲你只能使用繼承很簡單的應用程序。但隨着應用程序變得越來越複雜,如果您使用合成,您的類將更加靈活。因此,定義常見行爲,接​​口中的常見字段並要求具有這些常見行爲的類來實現它們。爲通用接口提供實現,並讓您的類將調用委託給實現類。

下面是一個例子:

interface Uniqueness { 
    long getUUID(); 
    void setUUID(long uuid); 
} 

interface Storable { 
    long getId(); 
    void setId(long id); 
} 

class UniquenessSupport implements Uniqueness { 

    private long uuid; 

    @Override 
    public long getUUID() { 
     return uuid; 
    } 

    @Override 
    public void setUUID(long uuid) { 
     this.uuid = uuid; 
    } 
} 

class StorableSupport implements Storable { 
    private long id; 

    @Override 
    public long getId() { 
     return id; 
    } 

    @Override 
    public void setId(long id) { 
     this.id = id; 
    } 
} 

class Some implements Uniqueness, Storable { 

    private UniquenessSupport uniquenessSupport; 
    private StorableSupport storableSupport; 

    public Some() { 
     uniquenessSupport = new UniquenessSupport(); 
     storableSupport = new StorableSupport(); 
    } 

    @Override 
    public long getUUID() { 
     return uniquenessSupport.getUUID(); 
    } 

    @Override 
    public void setUUID(long uuid) { 
     uniquenessSupport.setUUID(uuid); 
    } 

    @Override 
    public long getId() { 
     return storableSupport.getId(); 
    } 

    @Override 
    public void setId(long id) { 
     storableSupport.setId(id); 
    } 
} 

在這個簡單的情況下,有大量的樣板代碼,但是當你添加更多的字段和方法,你的類,這是有靈活性和避免代碼的唯一途徑複製。如果你將有更多的接口,讓我們說:PayableSendableReturnable並希望創建一個新的類,它是唯一的Payable並具有Uniqueness,你僱用合適的接口和支持類:Uniqueness + UniquenessSupportPayable + PayableSupport只。

另一方面,如果使用繼承,你會延長,將需​​要包含的所有方法從PayableSendable等,以滿足所有需求的一些基礎類,但你的類將需要僅Payable並具有Uniqueness。通過繼承,你也可以使它成爲Returnable,Storable等。

+0

我同意你的誘惑 – 2013-03-20 22:21:33

+0

贊同繼承的組合:) – Porkbutts 2013-03-20 22:23:10

+0

嗯......所以如果你創建一個名爲唯一性的接口(缺少更好的名稱) getter和setter用於UUID,另一個名爲Storable的接口需要用於Id的getter和setter,然後您必須創建兩個實現類,然後您需要eiter有一個字段,我想在每個需要此功能的域類中創建並創建另一組setter/getter或者你仍然需要通過層次繼承這些?請舉例說明,因爲我不確定我是否理解這一點。 – LuckyLuke 2013-03-21 06:36:41

0

這真的是繼承是,本地化類屬性/是許多不同類別之間的共同行爲。你的例子相當簡單,但仍然看起來像是繼承的合理使用。

+0

這可能無法提供足夠的靈活性。可以說,在未來會有更多的實體繼續存檔。他們將延伸一些DbEntity類。但現在一個班不能被吸引到數據庫和文件。 – 2013-03-20 22:12:03

+0

@omerschleifer - 可能。我不可能涵蓋所有這些功能的不同可能的路線圖:)只是提到這是繼承的原因......將公共屬性/行爲本地化爲單個父類。 – Daedalus 2013-03-20 22:14:33

0

如果所有的ID確實是供應簡單的get/set我會用一個接口:IDbEntity與喜歡的getId(),並可能SETID()的方法。

+0

但是,然後每個實現的類將仍然必須持有一個id成員。這是針對該領域的每個類的。 – giorashc 2013-03-20 22:09:56

+0

是的,在Java中沒有像.net這樣的屬性,也沒有像C++這樣的多項式繼承。這是一個補救措施,但正如我在我的評論中寫的那樣,它會提供更好的靈活性。在更復雜的情況下,一個組合可能被考慮而不是繼承 – 2013-03-20 22:18:41