c# - TDD 和继承

标签 c# inheritance tdd composition

我正在使用 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/

相关文章:

python - 使用 behave (python) 定义场景(或所需场景)的顺序

node.js - Nock 未在 Redux 测试中拦截 API 调用

c# - 在 Web API 中解密不记名 token

c# - 读取和写入 header 消息 MQ C#

c# - 使用SSRS和SSIS自动化Excel输出c#

c++ - 继承函数的重载解决方案

c# - 为什么在我的 ASP.Net 网站上大约每周一次出现 System.IO.FileLoadException : Could not load file or assembly,?

c# - 两个私有(private)子类到一个公共(public)类

asp.net - 由于映射,EF 继承的对象插入失败

c# - 文本文件导入项目中的 TDD