我有以下类型:
// incomplete class definition public class Person { private string name; public string Name { get { return this.name; } } }
我希望使用某种专用控制器/构建器创建和更新此类型,但我希望它对其他类型保持只读.
每次由控制器/构建器更新事件时,此对象还需要触发事件.
总结一下,根据以前的类型定义骨架:
在Person
只能通过特定的控制器被实例化
该控制器可以随时更新Person
(name
字段)的状态
将Person
需要一个发送通知到世界其他地方发生时
所有其他类型应该只能读取 Person
属性
我该如何实现呢?我在这里谈论的是控制器/构建器,但欢迎所有其他解决方案.
注意:我可以依赖internal
修饰符,但理想情况下我的所有东西都应该在同一个程序集中.
创建一个IReadOnlyPerson接口,它只公开get访问器.让人实施IReadOnlyPerson.将对Person的引用存储在控制器中.仅为其他客户端提供只读版本.
与大多数OO功能一样,这可以防止错误,但不能防止欺诈.如果客户碰巧知道(或怀疑)IReadOnlyPerson是由Person实现的,那么客户端可以运行时转换为Person.
根据评论更新:
Read Only接口也可以公开事件委托,就像任何其他对象一样.通常在C#中使用的习惯用法不会阻止客户端搞乱侦听器列表,但约定只是添加侦听器,因此这应该是足够的.在具有状态改变副作用的任何set访问器或函数内部,只需调用具有null(无侦听器)情况的保护的事件委托.