0

我有兴趣制作一个具有无法修改的属性的不可变类,以及一个派生自它的可变类。这些对象将是表示数据库记录的简单数据对象,因此它们的属性只有不可变的值。

我的目标是让我的数据访问层正常创建对象的可变版本,方法是根据数据库值设置属性,但将这些对象的只读版本传递回应用程序。(如果开发人员真的想要,代码可以将不可变对象显式转换回可变对象,我对此感到满意。)

我可以这样做很丑(这是一个词吗?),使用 getter 和 setter 的方法,并为可变类提供一个公共的新 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); }
}

如果可能的话,我更喜欢使用自动属性——调试时它们会更好。除此之外,我并不真正关心代码的外观,因为它只是来自代码生成器并且永远不会被查看。

有任何想法吗?

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

那么你不需要关心你的具体实现是否有一个setter——你的调用者只会使用getter。

作为旁注 - 您的代码看起来更像 Java 而不是 C#,所以我实际上会使用:

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 回答