4

基本的に、私は次のようなことをしようとしています:

SomeRequest request = new SomeRequest();
SomeResponse response = request.GetResponse();
List<Stuff> stuff = response.GetData();

SomeRequest と SomeResponse は、それぞれ IRequest インターフェイスと IResponse インターフェイスを実装するクラスです。

public class SomeRequest : IRequest<SomeResponse>
{
    public SomeResponse GetResponse() { ... }
}

public class SomeResponse : IResponse<List<Stuff>>
{
    public List<Stuff> GetData() { ... }
}

私の IResponse インターフェイスは次のようになります。

public interface IResponse<T>
{
    T GetData();
}

私が直面している問題は、私の IRequest インターフェイスにあります。IRequest インターフェイスのジェネリック (T) を IResponse< T > 型にしたい。

public interface IRequest<T> where T : ?????
{
    T GetResponse();
}

「where T」の後に何を入れるべきかわかりません。

ここで2つの解決策を見つけました. 「ジェネリック型」定義を持つC#ジェネリック「WHERE制約」?

最初の解決策は、次のように IRequest で IResponse< T> ジェネリックの型を指定することです。

public interface IRequest<T, U> where T : IResponse<U>

しかし、それは奇妙に思えます。なぜなら、Request は Response の知識のみを持つべきであり、Response が GetData() で返されることになっている型を知る必要はないからです。

2 番目のオプションは、非ジェネリック インターフェイス IResponse を作成し、それを IRequest のジェネリック型制約で使用することです。これは次のようになります。

public interface IResponse { }
public interface IResponse<T> { ... }
public interface IRequest<T> where T : IResponse 
{
    BaseResponse GetResponse();
}

ただし、このソリューションは私の SomeRequest クラスでコンパイルエラーを引き起こしました:

public class SomeRequest : IRequest<SomeResponse>
{
    public SomeResponse GetResponse() { ... }
}

エラー CS0738:SomeRequestインターフェイス メンバーが実装されておらずIRequest<SomeResponse>.GetResponse()、最適な実装候補のSomeRequest.GetResponse()戻り値の型SomeResponseがインターフェイス メンバーの戻り値の型と一致しませんIResponse

だから今、私はアイデアがありません。どんな助けでも大歓迎です!

4

2 に答える 2