实现一个接口,使泛型基于接口

Sma*_*ery 5 c# generics refactoring interface

我目前正在重构我的代码,以便所有重要的类实现一个接口(用于单元可测试性).我遇到了一个实现IComparable(非模板化)的类; 就像是:

public MyClass : IComparable
{
    public int CompareTo(object obj)
    {
        MyClass cObj = obj as MyClass;
        if (cObj == null) { throw new ArgumentException(); }
        // etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要将它与它接口,并在我使用时使用泛型; 这样的事情:

public IMyClass : IComparable<IMyClass>
{
    // Other methods here
}

public MyClass : IMyClass
{
    public CompareTo<IMyClass>(IMyClass other)
    {
        ...
    }
    // Other methods here
}
Run Code Online (Sandbox Code Playgroud)

但是,理想情况下,MyClass应该实现IComparable<MyClass>(然后MyClass应该实现的子类IComparable<MySubClass>).

所有这些都要问几个问题:

您如何看待我描述的方法?有没有更好的方法来进行这种重构?是否还有一点需要MyClass实施IComparable<MyClass>,或者因为我们已经实施了这一点是没有意义的IComparable<IMyClass>?我可以了解任何专业提示或"最佳"实践?

Ric*_*key 0

简短的回答:这取决于。

在您的具体示例中,我想说创建不必要的接口(在本例中)几乎总是错误的,IMyClass因为它只会为您创造工作。经验法则:仅当多个类实现接口时才使用接口。正如您所指出的,这个特定的接口甚至没有实现使您的类直接具有可比性的目标。

至于哪些类应该实现IComparable,通用的或其他的,这完全取决于您的比较需要是什么。如果始终在对基类的引用之间进行比较,则派生类不需要实现该接口,因为它永远不会被调用。