在C#中实现只读(不可变)对象接口

时间:2008-12-16 22:52:30

标签: c# interface abstract-class immutability readonly

我的目标是确保在大多数情况下通过“只读接口”使用对象,该接口是完整接口的子集。

  • 例如,如果我使用的是C ++,我只会返回一个const对象。
  • 在C#中,如果我可以通过接口实现这一点,我只会实现一个只读接口并在任何地方使用它。但是,我需要运算符重载,这是接口不允许的。这就是我必须使用抽象基类的原因。
  • 但是如果我定义一个抽象基类,我就不允许在派生类型中更改可访问性。

那么,我怎样才能在C#中实现目标?

4 个答案:

答案 0 :(得分:4)

如果将编写操作放在接口中然后在抽象基类上显式实现,那该怎么办?它不是100%完美的解决方案(您仍然可以将对象转换为修改界面),但在大多数情况下,它会阻止任何人意外调用修改方法。

答案 1 :(得分:3)

你真的需要运算符重载吗?我们在这里讨论语法糖。此外,并非所有.NET语言都以相同的方式使用运算符重载。因此,如果使用运算符重载,则可以有效地使用特定于代码语言。

我将实现只读接口并删除运算符重载要求。

答案 2 :(得分:2)

您可以通过对象中的状态实现只读行为,并在调用修改方法时抛出异常吗?

答案 3 :(得分:1)

如果有人对我所做的事感兴趣,我最终选择了抽象类而不是接口,我确实在派生类中隐藏了该方法以获得正确的访问者:

就像在基本抽象类(readonly接口)中一样:

protected double accuracy;
public double Accuracy { get { return accuracy; } }

在派生类中:

public new double Accuracy
{
    get { return accuracy; }
    set { accuracy = value; }
}

当然,丑陋的“新”关键字,但在这种情况下它会为我做。