2010-06-18 44 views
0
interface IFoo 
{ 
    int MyReadOnlyVar { get; } 
} 


class Foo : IFoo 
{ 
    int MyReadOnlyVar { get; set; } 
} 


public IFoo GetFoo() 
{ 
    return new Foo { MyReadOnlyVar = 1 }; 
} 

以上是实现readonly/immutable对象的可接受方式吗?的IFoo的不变性可以用一个临时演员到富被打破。隐藏接口的方法

通常(非关键的)的情况下,就隐藏通过接口功能的通用模式?或者它被认为是懒惰的编码?甚至是反模式?

回答

1

使用接口隐藏使类更小的接口是正确用法。我在Spring应用程序中看到很多这样的代码,其中依赖关系仅在类中表示(并且由Spring依赖注入使用),而不是在接口中,因为它们不提供任何域。

你不能保护你的代码与其他程序员。如果您担心有人会将界面转换为可变版本,如果您返回一个真正的只读快照,并且团队中的某个人为其添加了变异方法,则可能会发生同样的情况。

这也取决于你的代码。在一个项目/应用程序内,你可能会相信你的同事。在开发框架时,事情是不同的。然后,你必须决定是否返回“保存”对象,例如列表的克隆而不是可能被修改的真实列表。

所以是的,在一般情况下(非关键)的情况下恕我直言,这是适当的做你的方式。

0

您可以将Foo类的组件级别(在C#内部)可见,或使内部MyReadonlyVar的二传手,让你的代码将组件外部不必要的铸件进行保护。