我目前正在重构我的代码,以便所有重要的类都实现一个接口(用于单元可测试性)。我遇到了一个实现IComparable(非模板化)的类;类似的东西:
public MyClass : IComparable
{
public int CompareTo(object obj)
{
MyClass cObj = obj as MyClass;
if (cObj == null) { throw new ArgumentException(); }
// etc.
}
}
我想要将它与它接口,并在我使用时使用泛型;像这样的东西:
public IMyClass : IComparable<IMyClass>
{
// Other methods here
}
public MyClass : IMyClass
{
public CompareTo<IMyClass>(IMyClass other)
{
...
}
// Other methods here
}
但是,理想情况下,MyClass
应该实现IComparable<MyClass>
(然后MyClass
的子类应该实现IComparable<MySubClass>
)。
所有这些都要问几个问题:
您如何看待我描述的方法?有没有更好的方法来进行这种重构?是否有必要让MyClass
同时实施IComparable<MyClass>
,或者因为我们已经实施IComparable<IMyClass>
而没有意义?我可以了解任何专业技巧或“最佳”实践吗?
答案 0 :(得分:2)
让几个不同类型的对象相互比较真的有意义吗?语言允许这样做,但我可以依靠0手数我必须使用它的次数。
我建议您使用IClass
而不是IComparable
,并让派生类实现IComparable
。
P.S。我也反对添加“单元可测试性”接口。如果您的程序设计需要具有仅接口耦合的工厂模式,那么通过所有方法编写该复杂程度。但是不要abuse the design只是为了让你的测试更容易;改用摩尔。
答案 1 :(得分:0)
简短回答:这取决于。
在您的具体示例中,我会说创建一个不必要的接口(在这种情况下为IMyClass
)几乎总是错误的,因为它只是为您创建了工作。经验法则:仅在多个类实现接口时才使用接口。当你指出这个特殊的界面甚至没有达到使你的班级直接可比的目标时。
至于哪些类应该实现IComparable
,泛型或其他类,它完全取决于您的比较需求。如果总是在对基类的引用之间进行比较,则派生类不需要实现接口,因为它永远不会被调用。