我創建了一個名爲Base
有,因爲我想在我的系統中的所有對象,有一個存儲UUID
一個字段類添加字段。我還希望在可以存儲在數據庫中的所有對象上都有一個名爲id
的字段。我不會將它添加到Base
,因爲我的域圖層中的所有對象都不會被保存到數據庫中。我可以創建另一個繼承自Base
的類,並添加此字段,然後讓所有需要同時從中繼承的類。使用繼承在我的領域層
它應該儘量避免創建hieracies其存在添加這樣的字段的目的是什麼?有更好的選擇嗎?
我創建了一個名爲Base
有,因爲我想在我的系統中的所有對象,有一個存儲UUID
一個字段類添加字段。我還希望在可以存儲在數據庫中的所有對象上都有一個名爲id
的字段。我不會將它添加到Base
,因爲我的域圖層中的所有對象都不會被保存到數據庫中。我可以創建另一個繼承自Base
的類,並添加此字段,然後讓所有需要同時從中繼承的類。使用繼承在我的領域層
它應該儘量避免創建hieracies其存在添加這樣的字段的目的是什麼?有更好的選擇嗎?
因爲你只能使用繼承很簡單的應用程序。但隨着應用程序變得越來越複雜,如果您使用合成,您的類將更加靈活。因此,定義常見行爲,接口中的常見字段並要求具有這些常見行爲的類來實現它們。爲通用接口提供實現,並讓您的類將調用委託給實現類。
下面是一個例子:
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);
}
}
在這個簡單的情況下,有大量的樣板代碼,但是當你添加更多的字段和方法,你的類,這是有靈活性和避免代碼的唯一途徑複製。如果你將有更多的接口,讓我們說:Payable
,Sendable
,Returnable
並希望創建一個新的類,它是唯一的Payable
並具有Uniqueness
,你僱用合適的接口和支持類:Uniqueness
+ UniquenessSupport
和Payable
+ PayableSupport
只。
另一方面,如果使用繼承,你會延長,將需要包含的所有方法從Payable
,Sendable
等,以滿足所有需求的一些基礎類,但你的類將需要僅Payable
並具有Uniqueness
。通過繼承,你也可以使它成爲Returnable
,Storable
等。
我同意你的誘惑 – 2013-03-20 22:21:33
贊同繼承的組合:) – Porkbutts 2013-03-20 22:23:10
嗯......所以如果你創建一個名爲唯一性的接口(缺少更好的名稱) getter和setter用於UUID,另一個名爲Storable的接口需要用於Id的getter和setter,然後您必須創建兩個實現類,然後您需要eiter有一個字段,我想在每個需要此功能的域類中創建並創建另一組setter/getter或者你仍然需要通過層次繼承這些?請舉例說明,因爲我不確定我是否理解這一點。 – LuckyLuke 2013-03-21 06:36:41
這真的是繼承是,本地化類屬性/是許多不同類別之間的共同行爲。你的例子相當簡單,但仍然看起來像是繼承的合理使用。
這可能無法提供足夠的靈活性。可以說,在未來會有更多的實體繼續存檔。他們將延伸一些DbEntity類。但現在一個班不能被吸引到數據庫和文件。 – 2013-03-20 22:12:03
@omerschleifer - 可能。我不可能涵蓋所有這些功能的不同可能的路線圖:)只是提到這是繼承的原因......將公共屬性/行爲本地化爲單個父類。 – Daedalus 2013-03-20 22:14:33
如果所有的ID確實是供應簡單的get/set我會用一個接口:IDbEntity與喜歡的getId(),並可能SETID()的方法。
但是,然後每個實現的類將仍然必須持有一個id成員。這是針對該領域的每個類的。 – giorashc 2013-03-20 22:09:56
是的,在Java中沒有像.net這樣的屬性,也沒有像C++這樣的多項式繼承。這是一個補救措施,但正如我在我的評論中寫的那樣,它會提供更好的靈活性。在更復雜的情況下,一個組合可能被考慮而不是繼承 – 2013-03-20 22:18:41
你可能會選擇使用接口,並且需要一個'getUUID()'方法(和一個'getDatabaseId()'方法用於DB序列化對象) – Wug 2013-03-20 22:06:35
但是,如果equals和hashCode是基於UUID,那麼我就需要這個類的,我也希望有一個'是否新款()對於有'id'現場檢查它是否已經保存到數據庫中的所有對象'方法。 – LuckyLuke 2013-03-20 22:16:45