Class 使用 C# 中的通用 Class 和接口进行设计
Class Design with Generic Class and Interface in C#
我正在处理一段旧代码,并尝试使用 .NET 中的新进展重新实现它。但是,我无法完全理解相同的设计。以前没有模板 classes/interfaces,现在我需要使用它。我将尝试举例说明设计以及我遇到困难的地方。设计是这样的:
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>>
是不可能的。
我觉得我对这个场景有点太困惑了,一直在兜兜转转,没有任何具体的解决方案。
有人可以指出我正确的方向吗?
class Input<T> : Service<T>, Input
不应该是 class Input<T> : Input, Service<T>
吗?
... 如果可以,您应该将 Service<T>
重命名为 IService<T>
- 它是一个接口而不是 class。通过遵循最佳实践命名约定,写作
class Input<T> : IService<T>, Input
显然是错误的,因为接口依赖项列在唯一允许的基础 class 之前。
我正在处理一段旧代码,并尝试使用 .NET 中的新进展重新实现它。但是,我无法完全理解相同的设计。以前没有模板 classes/interfaces,现在我需要使用它。我将尝试举例说明设计以及我遇到困难的地方。设计是这样的:
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>>
是不可能的。
我觉得我对这个场景有点太困惑了,一直在兜兜转转,没有任何具体的解决方案。
有人可以指出我正确的方向吗?
class Input<T> : Service<T>, Input
不应该是 class Input<T> : Input, Service<T>
吗?
... 如果可以,您应该将 Service<T>
重命名为 IService<T>
- 它是一个接口而不是 class。通过遵循最佳实践命名约定,写作
class Input<T> : IService<T>, Input
显然是错误的,因为接口依赖项列在唯一允许的基础 class 之前。