我的目标是确保在大多数情况下,对象是通过作为完整接口子集的“只读接口”使用的。
- 例如,如果我使用 C++,我将只返回一个
const
对象。 - 在 C# 中,如果我可以通过接口实现这一点,我只会实现一个只读接口并在任何地方使用它。但是,我需要运算符重载,这对于接口是不允许的。这就是为什么我必须使用抽象基类。
- 但是如果我定义了一个抽象基类,我就不能改变派生类型的可访问性。
那么,如何在 C# 中实现我的目标?
我的目标是确保在大多数情况下,对象是通过作为完整接口子集的“只读接口”使用的。
const
对象。那么,如何在 C# 中实现我的目标?
如果你把你的写操作放在一个接口中,然后在抽象基类上显式地实现呢?这不是一个 100% 完美的解决方案(您仍然可以将对象强制转换为修改接口),但在大多数情况下,它可以防止任何人意外调用修改方法。
Do you really need operator overloading? We are talking about syntactic sugar here. Also, not all .NET languages utilize operator overloading in the same way. So, if you use operator overloading, you are effectively making your code language-specific.
I would implement the read-only interface and drop the operator overloading requirement.
您可以通过对象中的状态实现只读行为,并在调用修改方法时抛出异常?
如果有人对我所做的事情感兴趣,我最终选择了一个抽象类而不是接口,并且我确实将方法隐藏在派生类中以获得正确的访问器:
就像,在基础抽象类(只读接口)中:
protected double accuracy;
public double Accuracy { get { return accuracy; } }
在派生类中:
public new double Accuracy
{
get { return accuracy; }
set { accuracy = value; }
}
当然,“new”关键字很难看,但在这种情况下它会为我做。