c# - 测试接口(interface)实现是好的设计吗?

标签 c#

我有一个相当笼统的问题。拥有多个可能实现一个公共(public)接口(interface)但没有其他共同点的类并测试该接口(interface)是否被实现以执行某些操作是好的还是坏的设计?

示例:Builder 对象可以使用 Something 的子类实例进行外部配置。其中一些子类具有特殊的 BuildCommand 方法,有些则没有。如果当前 Something 没有 BuildCommand 方法,Builder 应该使用 BuildCommand 中定义的默认方法 目标类。

我不太确定我的解决方案是好设计还是坏设计。我会很感激你的意见。

非常感谢, 费边

public interface ICommandBuilder
{
    ICommand BuildCommand();
}

public class Something1 : Something
{
    /* ... */
}
public class Something2 : Something, ICommandBuilder
{
    /* ... */
}

public class Target : ICommandBuilder
{
    /* ... */
}

public class Builder
{
    public Something Something { get; set; }

    public Target CreateTarget()
    {
        var target = new Target();

        /* Some code to configure target */

        var commandBuilder = (Something as ICommandBuilder) ?? Target;
        target.AddCommand(commandBuilder.BuildCommand());

        return target;
    }
}

最佳答案

如果你需要 ICommandBuilder 然后使用 ICommandBuilder 类型的属性,这将使你的依赖关系清晰:

public class TargetBuilder
{
    public ICommandBuilder CommandBuilder { get; set; }
    public Something Something { get; set; }

    public Target CreateTarget()
    {
        var target = new Target();    
        /* Some code to configure target */

        var commandBuilder = CommandBuilder ?? target;
        target.AddCommand(commandBuilder.BuildCommand());

        return target;
    }
}

您可以将相同的对象实例分配给 SomethingCommandBuilder 属性。为两个不同的目的拥有两个不同的属性对我来说很清楚。没有检查 Something 是否实现 ICommandBuilder隐藏功能

您甚至可以创建构造函数,它将接受同时实现了 SomethingICommandBuilder 的类型,以简化这两个属性的分配:

public TargetBuilder()
{
}

public TargetBuilder(Something2 something2)
   : this(something2, something2)
{
}

public TargetBuilder(Something something, ICommandBuilder commandBuilder)
{
    Something = something;
    CommandBuilder = commandBuilder;
}

关于c# - 测试接口(interface)实现是好的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20949519/

相关文章:

这个 powershell 片段的 C# 等价物

c# - 单击图像的一部分

c# - 此方法的正确 api url 是什么?

c# - .NET HashSet 的内部实现包含方法?

c# - 使用 Entity Framework 6.4 进行延迟加载时如何异步调用关系?

c# - 为什么 integer == null 在 C# 中是一个有效的 boolean 表达式?

c# - 使用 QueueUserWorkItem 在单独的线程上发送电子邮件

c# - UWP 应用程序中应使用哪个命名空间类 HttpClient?

C# 将类作为字符串传递并从数组中转换它

c# - Visual Studio 减慢应用程序