我有一个相当笼统的问题。拥有多个可能实现一个公共(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;
}
}
您可以将相同的对象实例分配给 Something
和 CommandBuilder
属性。为两个不同的目的拥有两个不同的属性对我来说很清楚。没有检查 Something
是否实现 ICommandBuilder
的隐藏功能。
您甚至可以创建构造函数,它将接受同时实现了 Something
和 ICommandBuilder
的类型,以简化这两个属性的分配:
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/