Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口实现测试是否是良好的设计?_C# - Fatal编程技术网

C# 接口实现测试是否是良好的设计?

C# 接口实现测试是否是良好的设计?,c#,C#,我有一个相当笼统的问题。有几个类可能实现一个公共接口,但没有其他共同点,并且测试接口是否实现以执行某些操作,这是好的设计还是坏的设计 示例:Builder对象可以在外部配置为Something子类的实例。这些子类中的一些有一个特殊的BuildCommand方法,有些没有。如果当前的Something没有BuildCommand方法,Builder应该使用Target类中定义的默认BuildCommand方法 我不确定我的解决方案是好是坏。我很感激你的意见 多谢各位, 费边 如果需要IComman

我有一个相当笼统的问题。有几个类可能实现一个公共接口,但没有其他共同点,并且测试接口是否实现以执行某些操作,这是好的设计还是坏的设计

示例:
Builder
对象可以在外部配置为
Something
子类的实例。这些子类中的一些有一个特殊的
BuildCommand
方法,有些没有。如果当前的
Something
没有
BuildCommand
方法,
Builder
应该使用
Target
类中定义的默认
BuildCommand
方法

我不确定我的解决方案是好是坏。我很感激你的意见

多谢各位, 费边


如果需要
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;
    }
}
您可以将对象的同一实例分配给
某物
CommandBuilder
属性。有两个不同的属性用于两个不同的目的在我看来很清楚。没有检查
某物是否实现
ICommandBuilder
隐藏功能

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

public TargetBuilder()
{
}

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

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

不,有些东西更有用。BuildCommand方法是类中相当小的一部分。@fdub这就是为什么我写了关于将同一实例分配给两个属性的内容实例是通过反序列化xml文件创建的。根据您的建议,我不知道它是哪个子类,我必须再次执行显式类型或接口检查以设置CommandBuilder属性。我也不能使用显式子类,因为它们不断变化(有些被删除,有些被添加)。@fdub您将问题指定为相当一般的问题,但没有提到任何xml反序列化。我提供了相当一般的代码,我会使用Sergey,只是示例比较具体,问题本身是指一般性的。也许这不是最好的例子来说明这个问题。如果一些子类实现了
ICommandBuilder
,而有些子类没有实现,那么我不喜欢我的实现中的隐藏特性(感谢这个术语!)。在不知道所有子类的情况下,无法知道
某些东西
可能与
ICommandBuilder
相关。。。我喜欢
CommandBuilder
属性的想法,并将尝试找到实现它的方法。谢谢。请避免使用诸如
Something1
Something2
等名称。阅读起来确实很痛苦。
public TargetBuilder()
{
}

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

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