0

変更できないプロパティを持つ不変クラスと、そこから派生する可変クラスを作成することに興味があります。これらのオブジェクトは、データベース レコードを表す単純なデータ オブジェクトであるため、プロパティの不変値のみを持ちます。

私の目標は、データベースの値に基づいてプロパティを設定し、これらのオブジェクトの読み取り専用バージョンをアプリケーションに戻すことによって、データ アクセス レイヤーでオブジェクトの変更可能なバージョンを正常に作成することです。(開発者が本当に望んでいるのであれば、コードが不変オブジェクトを可変オブジェクトに明示的にキャストできるという事実には問題ありません。)

ゲッターとセッターのメソッドを使用し、ミュータブル クラスのパブリックな新しいセッターを使用して、これを醜く行うことができます (それは単語ですか?)。

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); }
}

可能であれば、自動プロパティを使用することをお勧めします。デバッグ時には、自動プロパティの方がはるかに優れています。それ以外は、コードがどのように見えるかはあまり気にしません。すべてコード ジェネレーターから取得され、決して見られることはないからです。

何か案は?

4

4 に答える 4

3

インターフェイスを使用します。クライアントに返される読み取り専用インターフェイスと、それを実装するがデータ アクセス レイヤーでのみ使用される完全に書き込み可能なクラスを用意します。

interface IReadOnlyObject
{
    int Property { get; }
}

class DALObject : IReadOnlyObject
{
    public int Property { get; set; }
}
于 2009-11-19T21:55:46.503 に答える
2

データ レイヤーに読み取り専用インターフェイスを返すように設定できます。

interface IClient
{
     int getClientId();
}

次に、具体的な実装にセッターがあるかどうかを気にする必要はありません。呼び出し元はゲッターのみを使用します。

補足として、あなたのコードは C# よりも Java に似ているので、実際には以下を使用します。

interface IClient
{
     int ClientId { get; }
}
于 2009-11-19T21:55:49.420 に答える
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.
}
于 2009-11-19T21:56:47.003 に答える
0

ミューテーターを提供しないが、不変性の約束を提供しない基本クラスを用意します。派生した不変クラスと、個別に派生した可変クラスがあります。すべてのクラスには、基本クラスを受け入れるコンストラクターと、コンストラクターを呼び出すか (オブジェクトが既に不変クラスの場合) を返すことによって、不変の派生クラスのオブジェクトを返すオーバーロード可能/オーバーロードされた "AsImmutable" プロパティが必要です。自体。

于 2010-12-01T15:45:00.387 に答える