2009-11-19 70 views
0

我對創建一個不可修改屬性的不可變類以及從其派生的可變類感興趣。這些對象將是表示數據庫記錄的簡單數據對象,因此它們只有屬性的不可變值。任何方式來從C#中的不可變對象派生可變對象?

我的目標是通過基於數據庫值設置屬性,但將這些對象的只讀版本傳回應用程序,讓我的數據訪問層正常創建對象的可變版本。 (如果開發者真的想要,代碼可以明確地將不可變對象轉換回可變對象的事實,我很好)。

我可以這樣做uglily(是一個單詞嗎?),使用方法getter和setter和對於該可變類公共新二傳:

public class ImmutableClient { 
    private int _clientId; 
    public int getClientId() { return _clientId; } 
    protected void setClientId(int clientId) { _clientId = clientId; } 
} 

public class Client : ImmutableClient { 
    public new void setClientId(int clientId) { base.setClientId(clientId); } 
} 

我寧願儘可能使用自動性能 - 他們是在調試的時候好多了。除此之外,我並不關心代碼的外觀,因爲它只是全部來自代碼生成器,並且永遠不會被查看。

任何想法?

回答

3

我會使用一個接口。擁有一個返回給客戶端的只讀接口和一個實現它的完全可寫類,但僅用於數據訪問層。

interface IReadOnlyObject 
{ 
    int Property { get; } 
} 

class DALObject : IReadOnlyObject 
{ 
    public int Property { get; set; } 
} 
+0

這很完美 - 我的思維如此枯燥,我甚至沒有考慮過接口,但這對我的場景絕對有用。非常感謝你。 – 2009-11-19 22:06:06

2

你可以有你的數據層的回只讀接口:

interface IClient 
{ 
    int getClientId(); 
} 

那麼你不需要關心,如果你的具體實施有一個setter與否 - 來電者只會使用吸氣劑。

作爲一個側面說明 - 你的代碼看起來更象Java比C#,所以我居然會使用:

interface IClient 
{ 
    int ClientId { get; } 
} 
+0

完美 - 看起來你和馬特回答幾乎相同的時間... 我不喜歡在Java的語法,但在我的例子,我不得不讓他們分開,如果我想只實現在吸氣不變的版本 - 類似java的方式是我當時唯一可以考慮的方式。 接口將是完美的 - 謝謝。 – 2009-11-19 22:08:07

0

永恆不變的意思。當我看到一個類型是不可變的時,我知道我可以緩存它並多次操作,而不會改變它。可變狀態使得這個假設毫無價值。

class Foo 
{ 
    // I'm immutable 
} 

class Bar : Foo 
{ 
    // I add mutable properties 
} 

... 

void F(Foo foo) 
{ 
    // foo is immutable - therefore Bar (mutable) *cannot* be derived from Foo. 
} 
+0

謝謝 - 我想「不可變的」不是描述我目標的正確詞彙。我只想要一個開發人員無法輕易修改外部代碼的對象。它不是真正的不變的,只是幾乎不變的。 當然,從我所知道的情況來看,確實不存在真正不可改變的領域 - 一旦你對遊戲進行了反思,修改私有隻讀字段是可能的。 – 2009-11-19 22:13:22

0

有一個基類,它不提供增變,但不提供不變性的承諾。有一個派生的不可變類和一個單獨派生的可變類。所有類都應該有一個接受基類的構造函數,以及一個可重載/重載的「AsImmutable」屬性,它將返回不可變派生類的對象,可以通過調用構造函數或(如果對象已經是不可變類)返回本身。