私は古いコードに取り組んでおり、.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
type ではなく type を想定しているため、 でエラーが発生しますInput<T>
。
ただしWorkOnInput
、型の引数を受け入れるように変更Input<T>
すると、ジェネリック メソッドWorkOnInput<T>
にする必要があり、それを呼び出す必要がある場合は、入力の型を明示的に指定する必要がありますが、これも望ましくありません。
また、渡す必要がある入力のリストがあり、それはAnotherMethod()
不可能List<Input<T>>
です。
シナリオに少し混乱しすぎて、具体的な解決策がないままぐるぐる回っていると思います。
誰かが私を正しい方向に向けることができますか?