0

私は古いコードに取り組んでおり、.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)ここではInputtype ではなく type を想定しているため、 でエラーが発生しますInput<T>

ただしWorkOnInput、型の引数を受け入れるように変更Input<T>すると、ジェネリック メソッドWorkOnInput<T>にする必要があり、それを呼び出す必要がある場合は、入力の型を明示的に指定する必要がありますが、これも望ましくありません。

また、渡す必要がある入力のリストがあり、それはAnotherMethod()不可能List<Input<T>>です。

シナリオに少し混乱しすぎて、具体的な解決策がないままぐるぐる回っていると思います。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

2

すべきではありませclass Input<T> : Service<T>, Inputclass Input<T> : Input, Service<T>か?

Service<T>...そして可能であれば、次のように名前を変更する必要がありますIService<T>-これはクラスではなくインターフェースです。ベスト プラクティスの命名規則に従うことで、

class Input<T> : IService<T>, Input

インターフェイスの依存関係が、許可されている唯一の基本クラスの前にリストされているため、明らかに間違っています。

于 2015-09-24T14:06:09.063 に答える