1

我正在IXmlSerializable一个不可变的类中实现。为了保持类不可变,我显式地实现了接口,以便隐藏方法,并使用ReadXml()封装方法的静态方法ReadXml(XmlReader reader),而是返回我的类的新实例。但是,假设该类被调用ClassA,我被迫实现的方式IXmlSerializable意味着该语句

((ClassA)((IXmlSerializable)(ClassAObject)).ReadXml(reader))

实际上改变了ClassAObject因为,在里面IXmlSerializable.ReadXml我分配给一个已经创建的对象的参数。那个存在,ClassAObject还可以被认为是不可变的吗?

4

2 回答 2

1

不。

显式实现接口并不意味着“隐藏”方法 - 只是为了避免在两个接口定义具有相同签名的成员时产生歧义。“隐藏”方面也是可用的,但只是为了防止您自己的代码中出现错误——您必须显式地转换对象,这意味着您知道自己在做什么。

补充:但是......也许你可以通过在调用后“锁定”它来非常接近不可变对象ReadXml(),因此进一步调用它会引发异常。因此,对象在被读取后变得不可变。如果对象是由另一个构造函数而不是无参数构造函数构造的,那么如果您还锁定该对象,那就太好了。根据您首先想要不变性的原因,这可能适合您的需求。

于 2011-06-29T10:51:50.697 回答
0

我认为您应该考虑具有公共 getter/setter 的数据传输对象 (DTO),只是为了传输序列化的对象数据。

于 2011-11-12T07:28:10.213 回答