C#中具有通用类和接口的类设计

时间:2015-09-24 11:53:23

标签: c# generics class-design generic-interface

我正在处理一段旧代码并试图用.NET中的新进展重新实现它。但是,我不能围绕设计包围我的头。以前没有模板类/接口,现在我需要使用相同的。我将尝试举例说明设计以及我遇到的问题。设计是这样的:

interface Service<T>
{
    T Value;
    Task AsyncWork();
}

class Input<T> : Service<T>, Input
{
    Worker w1;
    Task AsyncWork()
    {
        w1.WorkOnInput(this); //error
        ... //will return a Task eventually
    }

}

class Input
{
    //common members and methods for child classes
    int priority;
    string Name;
    FormatInput()
    {
        //some common implementation
    }

}

class StringInput:Input<string>
{
    //Implementation specific to string input
}

class IntInput:Input<int>
{
    //Implementation specific to int input
}

class Worker
{
    WorkOnInput(Input)
    {
        ...
    }
}

Main()
{
    Worker w = new Worker();
    Input input1 = new StringInput();
    Input input2 = new IntInput();
    input1.FormatInput();
    input2.FormatInput();
    List<Input> inputList = new List<Input>();
    inputList.Add(input1);
    inputList.Add(input2);
    AnotherMethod(inputList); //another method which expects a list of Inputs
    w.WorkOnInput(input1);
    w.WorkOnInput(input2);
}

我无法更改接口实现,因为我不是相同的所有者。但是,由于评论显示我在w1.WorkOnInput(this)会出现错误,因为此处预计Input类型而不是Input<T>

但是,如果我将WorkOnInput更改为接受Input<T>类型的参数,那么我必须将它作为WorkOnInput<T>的通用方法,如果我需要调用它,我会显然必须提供输入的类型,这也是不可取的。

此外,我还有一个输入列表,需要传递给AnotherMethod(),而List<Input<T>>是不可能的。

我认为我对这种情况有点过于困惑,而且没有任何具体的解决方案,我会四处走动。

有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

不应该class Input<T> : Service<T>, Inputclass Input<T> : Input, Service<T>吗?

...如果可以,您应该将Service<T>重命名为IService<T> - 这是一个接口而不是一个类。通过遵循最佳实践命名约定,它将使写作

class Input<T> : IService<T>, Input
明显而且显然是错误的,导致接口依赖性列在唯一允许的基类之前。