我有一组接口,与特定可变对象密切配合使用。
许多对象的用户只需要从对象中读取值,而且只需要读取其中的几个属性。为了避免名称空间污染(更容易使用智能感知)并传达使用意图,我想拥有一个小的基础接口,它仅以只读方式公开少数“关键”属性。
然而,几乎所有的实现都会支持完整的接口,包括可修改性。
不幸的是,我在用C#表达这个概念时遇到了障碍:
interface IBasicProps {
public int Priority { get; }
public string Name {get;}
//... whatever
}
interface IBasicPropsWriteable:IBasicProps {
public int Priority { set; } //warning CS0108: [...] hides inherited member [...]
public string Name { set; }
//... whatever
}
我当然没有打算隐藏任何成员,所以这不好!
当然,我可以使用方法来解决问题,但什么是正确的选择呢?即使拆分接口没有其他目的,只是为了传达意图,我也希望保持“核心”接口尽可能小。通过拆分接口,很明显哪些方法不会更新,这使编写代码更加清晰(更不用说还允许漂亮而简单的静态单例存根适用于相当多的简单情况)。
我想避免使用任何抽象类之类的东西;它们使重新实现或快速的单一目的 shim 变得更加复杂和难以理解。
那么,有什么想法吗?
IBasicProps<out T> {/*...*/ } IBasicPropsWriteable<T>:IBasicProps<T> {}
。在这里,接口分离是必要的;一个中央管理器希望使用协变将各种对象放入一个集合中,但每个对象的单独所有者知道它包含的类型。 - Eamon Nerbonnenew
修饰符仍然不尽人意,因为它意味着“存在一个无关的同名属性,旧属性仍然存在,但需要更复杂的语法通过IBasicPropsWriteable
进行访问”。如果您可以使用额外的访问器扩展“相同”的属性,那将是很好的。(继承类之间也存在同样的问题。)使用您的解决方案,代码static void M(IBasicPropsWriteable x) { var a = x.Name; var b = ((IBasicProps)x).Name; }
正式读取两个不同的成员! - Jeppe Stig Nielsen