interface IFoo
{
int MyReadOnlyVar { get; }
}
class Foo : IFoo
{
int MyReadOnlyVar { get; set; }
}
public IFoo GetFoo()
{
return new Foo { MyReadOnlyVar = 1 };
}
以上是实现readonly / immutable对象的可接受方式吗? IFoo的不变性可以通过临时转换为Foo来打破。
在一般(非关键)情况下,通过接口隐藏功能是一种常见模式吗?或者它被认为是懒惰的编码?甚至是反模式?
答案 0 :(得分:1)
使用接口隐藏使类的接口更小是正确的用法。我在Spring应用程序中看到了很多这样的代码,其中依赖项仅在类中表示(并由Spring依赖注入使用)而不是在接口中,因为它们不为域提供任何内容。
您无法保护代码免受其他编码人员的侵害。如果你担心有人会将界面强制转换为可变版本,那么如果你返回一个真正的只读快照并且团队中的某个人为其添加了变异方法,则会发生同样的情况。
这还取决于您的代码。在项目/应用程序中,您可能信任您的同事。在开发框架时,事情是不同的。然后你必须决定是否要返回“保存”对象,例如列表的克隆而不是可能被修改的真实列表。
所以是的,一般情况下(非关键)情况恕我直言,你可以按照自己的方式行事。
答案 1 :(得分:0)
您可以仅在汇编级别(C#内部)显示Foo类,或者在内部设置MyReadonlyVar的setter,这样可以保护您的代码免受汇编之外的不必要的强制转换。