私は必要なものに対してエレガントでない解決策を持っていますが、それを置き換えるためのエレガントな解決策を探しています。
次のコードはコンパイルされませんが、私がやりたいことを表しています。
interface IWebService
{
}
abstract class BaseClient<T>
{
}
class SpecializedClient : BaseClient<IWebService>
{
}
class ClientHelper<T> where T : BaseClient<*>
{
}
ここで、T
inは、渡されたテンプレートタイプに関係なくClientHelper<T>
拡張するクラスです。BaseClient
私が見つけたエレガントでない解決策は次のとおりです。
class ClientHelper<T, U> where T : BaseClient<U> {}
これがエレガントでなくなる理由は、私のプロジェクトが次のようなクラスになってしまうためです。
class MyClass<A, B, C, D, E, F, G> where A : MyBaseClass<B, C, D, E, F, G>
単一の型をとる基本クラスに至るまで。これは単にジェネリッククラスの複雑な継承ツリーを持つためのコストですか、それともテンプレート型の型制限を保持しながらこれを行うためのより簡単な方法がありますか?