【问题标题】:Method hiding with interfaces使用接口隐藏方法
【发布时间】:2010-06-18 10:16:06
【问题描述】:
interface IFoo
{
int MyReadOnlyVar { get; }
}
class Foo : IFoo
{
int MyReadOnlyVar { get; set; }
}
public IFoo GetFoo()
{
return new Foo { MyReadOnlyVar = 1 };
}
以上是实现只读/不可变对象的可接受方式吗? IFoo 的不变性可以通过临时转换为 Foo 来打破。
在一般(非关键)情况下,通过接口隐藏功能是一种常见模式吗?或者它被认为是惰性编码?甚至是反模式?
【问题讨论】:
标签:
design-patterns
interface
oop
【解决方案1】:
使用接口隐藏使类的接口更小是正确的用法。我在 Spring 应用程序中看到了很多这样的代码,其中依赖项仅在类中表达(并由 Spring 依赖注入使用)而不是在接口中,因为它们不为域提供任何东西。
您无法保护您的代码免受其他编码人员的侵害。如果您担心有人会将接口转换为可变版本,那么如果您返回一个真正的只读快照并且您团队中的某个人向其中添加了变异方法,也会发生同样的情况。
这也取决于您的代码。在项目/应用程序中,您可能会信任您的同事。在开发框架时,情况有所不同。然后你必须决定是否总是返回“保存”对象,例如列表的克隆,而不是可能被修改的真实列表。
所以是的,在一般(非关键)情况下,恕我直言,按照自己的方式去做是合适的。
【解决方案2】:
您可以使 Foo 类仅在程序集级别可见(在 C# 中是内部的),或者将 MyReadonlyVar 的 setter 设置为内部,因此您的代码将受到保护,不会在程序集之外进行不必要的强制转换。