構築時にデータベースから情報をロードするクラスがあります。情報はすべて変更可能であり、開発者はその情報に対してSave()を呼び出して、その情報をデータベースに保存し直すことができます。
また、データベースからロードするクラスを作成していますが、データベースの更新は許可していません。(読み取り専用バージョン。)私の質問は、別のクラスを作成して継承するか、コンストラクターで読み取り専用パラメーターを取得するように既存のオブジェクトを更新するか、それとも完全に別のクラスを作成するかです。
既存のクラスは、コード内の多くの場所ですでに使用されています。
ありがとう。
アップデート:
まず、ここにはたくさんの素晴らしい答えがあります。1つだけを受け入れるのは難しいでしょう。みんな、ありがとう。
主な問題は次のとおりです。
- クラス名と継承構造に基づいて期待に応えます。
- 不要な重複コードの防止
ReadableとReadOnlyには大きな違いがあるようです。読み取り専用クラスはおそらく継承されるべきではありません。しかし、Readableクラスは、ある時点で書き込み可能性も得られる可能性があることを示唆しています。
よく考えた後、私が考えていることは次のとおりです。
public class PersonTestClass
{
public static void Test()
{
ModifiablePerson mp = new ModifiablePerson();
mp.SetName("value");
ReadOnlyPerson rop = new ReadOnlyPerson();
rop.GetName();
//ReadOnlyPerson ropFmp = (ReadOnlyPerson)mp; // not allowed.
ReadOnlyPerson ropFmp = (ReadOnlyPerson)(ReadablePerson)mp;
// above is allowed at compile time (bad), not at runtime (good).
ReadablePerson rp = mp;
}
}
public class ReadablePerson
{
protected string name;
public string GetName()
{
return name;
}
}
public sealed class ReadOnlyPerson : ReadablePerson
{
}
public class ModifiablePerson : ReadablePerson
{
public void SetName(string value)
{
name = value;
}
}
残念ながら、これをプロパティで行う方法はまだわかりません(これについては、プロパティで行われるStriplingWarriorの回答を参照してください)が、保護されたキーワードと非対称プロパティアクセス修飾子が含まれると思います。
また、幸いなことに、データベースからロードされるデータは、参照オブジェクトに変換する必要はなく、単純なタイプです。これは、オブジェクトのメンバーを変更する人を本当に心配する必要がないことを意味しReadOnlyPerson
ます。
アップデート2:
StriplingWarriorが示唆しているように、ダウンキャストは問題を引き起こす可能性がありますが、サルを犬にキャストし、動物を犬にキャストするのは悪い場合があるため、これは一般的に当てはまります。ただし、キャストはコンパイル時に許可されていても、実際には実行時に許可されていないようです。
ラッパークラスでもうまくいくかもしれませんが、渡されたオブジェクトをディープコピーする必要がない/渡されたオブジェクトを変更できるようにしてラッパークラスを変更する必要がないため、これがより好きです。