我正在使用 TDD 开发我的第一个项目,但在继承方面遇到了一些困难。
例如如果我有这样的东西
public interface IComponent
{
void MethodA();
void MethodB();
}
public class Component : IComponent
{
public virtual void MethodA()
{
// Do something
}
public virtual void MethodB()
{
// Do something
}
}
public class ExtendedComponent : Component
{
public override void MethodA()
{
base.MethodA();
// Do something else
}
}
那么我无法单独测试 ExtendedComponent,因为它依赖于 Component。
但是,如果我像这样使用组合来创建 ExtendedComponent
public class ExtendedComponent : IComponent
{
private readonly IComponent _component;
public ComponentB(IComponent component)
{
_component = component;
}
public virtual void MethodA()
{
_component.MethodA();
// Do something else
}
public virtual void MethodB()
{
_component.MethodB();
}
}
我现在可以通过模拟包装的 IComponent 来单独测试 ExtendedComponent。
这种方法的缺点是,如果我想向 IComponent 添加新方法,则必须将新方法添加到 Component 和 ExtendedComponent 以及可能有很多的任何其他实现。使用继承,我可以将新方法添加到基本组件,而不会破坏其他任何东西。
我真的希望能够干净地进行测试,所以我更喜欢组合路线,但我担心能够进行单元测试并不是始终使用组合而不是继承的正当理由。此外,在基础级别添加功能将需要创建许多繁琐的委托(delegate)方法。
对于其他人如何解决此类问题的一些建议,我真的很感激
最佳答案
您使用组合的方法实际上是大多数编译器实现继承的方式,因此除了付出沉重的代价(大量样板代码)之外,您一无所获。所以在有is-a关系的时候坚持继承,有has-关系的时候坚持组合(当然那些既不是金子也不是唯一的规则)
关于c# - TDD 和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12932560/