【发布时间】:2011-05-04 16:08:39
【问题描述】:
我想知道 C# 中关于可变/不可变接口的最佳实践是什么。
我喜欢只处理接口而不是真实对象;删除依赖项并允许更轻松的测试。
我通常还公开只读接口,从而降低错误。 但是,当我需要更改对象实例的内容时,这会在实际代码中产生问题。
这就是我想要做的事情
public interface ISomething
{
string Name { get; }
}
public interface IMutableSomething : ISomething
{
string Name { get; set; }
}
...
public class ConsumerClass
{
//Note that I'm working against the interface, not the implementation
public void DoSomethingOnName(ISomething o)
{
var mutableO = (IMutableSomething) o;
mutableO.Name = "blah";
}
}
以这种方式工作让我可以轻松测试 ConsumerClass 并打破 ISomething 与其实现之间的任何依赖关系
我知道我可以将接口转换为实现,但这会引入对实际实现的依赖。
我可以做类似下面的事情,但我觉得它丑陋和烦人
public interface IMutableSomething : ISomething
{
void SetName(string newName)
}
or
public interface IMutableSomething // No inheritance, implementation impl. 2 interfaces
{
string Name { get; set; }
}
谢谢,
埃里克 G.
【问题讨论】:
-
这对我来说似乎有点好笑 - 你正在传递具有特定接口的东西(我将其解读为“正常工作的最低要求”),然后将其转换为具有进一步要求的对象就可以了(现在必须允许设置)。这有点像设置一个球门柱,然后当有人到达它时说,哦,是的,顺便说一句,这不是球门柱,它只是一个半路标记
-
另外,为了接口而接口并不是真的那么有用。
标签: c# inheritance interface properties readonly