汎用クラスの現在の構造が与えられている場合。私が欲しいものタイプは、汎用クラスのパラメータとして使用するために変換可能でなければなりません
public abstract class Foo<TFoo, TBar>
where TFoo : Foo<TFoo, TBar>
where TBar : Bar<TFoo, TBar>
{
}
public abstract class Foo<TFoo> : Foo<TFoo, BarImpl>
where TFoo : Foo<TFoo>
{
}
public class FooImpl : Foo<FooImpl>
{
}
public abstract class Bar<TFoo, TBar>
where TFoo : Foo<TFoo, TBar>
where TBar : Bar<TFoo, TBar>
{
}
public abstract class Bar<TFoo> : Bar<TFoo, BarImpl>
where TFoo : Foo<TFoo>
{
}
public class BarImpl : Bar<FooImpl>
{
}
はFoo<TFoo>
の各実装にデフォルトBar
を設定することです。 コード内の他の部分でTBar
のインスタンスが作成されます。の場合は失敗し、abstract
クラスです。
しかし、次のエラーがスローされ、私は何ができるのか、これがまったく可能なのか分かりません。
型「BarImplは」パラメータとしてそれを使用するために「バー」に変換可能でなければならない「TBar」ジェネリッククラスに「foo」で
私はすでにBarImpl
がBar<FooImpl, BarImpl>
から派生させてみましたそれは効果がなかった。
タイプBar<TFoo>
のオブジェクトがintantiatedされるまで(それはabtractだのため)
public abstract class Foo<TFoo> : Foo<TFoo, Bar<TFoo>>
where TFoo : Foo<TFoo>
{
}
public abstract class Bar<TFoo> : Bar<TFoo, Bar<TFoo>>
where TFoo : Foo<TFoo>
{
}
にそれを変更すると動作します。
おそらく、あまりにも多くのレベルのジェネリックと迂回があります。私は自分の頭を回転させて、どんなタイプが継承しているか、実装しているか、または制約に基づいているか、制約に従っているかを追求します。この例を簡略化することはできますか? –
Fooは独自のBarインスタンスを作成してはいけませんが、FooImplから継承された(コンストラクタ)か継承されている必要がありますか? – Terence
@ LasseV.Karlsen私はこのことについて数日から頭が回転しているので、これを単純化してうれしいです。どんなアイデアでも大歓迎です。私の質問が私がここで達成しようとしていることを明確にするかどうか分かりません... – KingKerosin