我有一个类,它在构建时从数据库中加载它的信息。该信息都是可修改的,然后开发人员可以对其调用 Save() 以使其将该信息保存回数据库。
我还在创建一个将从数据库加载的类,但不允许对其进行任何更新。(只读版本。)我的问题是,我应该创建一个单独的类并继承,还是应该只更新现有对象以在构造函数中采用只读参数,还是应该完全创建一个单独的类?
现有的类已经在代码中的许多地方使用。
谢谢。
更新:
首先,这里有很多很棒的答案。很难只接受一个。谢谢大家。
主要问题似乎是:
- 满足基于类名和继承结构的期望。
- 防止不必要的重复代码
Readable 和 ReadOnly 之间似乎有很大的区别。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 所建议的那样,向下转换可能会导致问题,但这通常是正确的,因为将猴子转换为狗,将动物向下转换为狗可能很糟糕。然而,似乎即使在编译时允许强制转换,但在运行时实际上是不允许的。
包装器类也可以解决问题,但我更喜欢这个,因为它避免了必须深度复制传入的对象/允许修改传入的对象从而修改包装器类的问题。