基本的に、私は次のようなことをしようとしています:
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
だから今、私はアイデアがありません。どんな助けでも大歓迎です!