Java では、ジェネリクスとワイルドカードの操作にかなり慣れています。次のようなもの: List<? extends Animal>
. これにより、動物のサブタイプのコレクションを取得し、各要素に対して一般的なルーチンを実行できます (例: makeNoise()
)。私は C# でこれを達成しようとしていますが、ワイルドカードがないため、少し混乱しています。
ドメインに関しては、ここで行っていることは、SQL SMO ライブラリを使用して、データベースからスクリプトを収集することです。さまざまなオブジェクト (テーブル、ビュー、関数など - これは T です) をスクリプト化して収集するために、何度も拡張された基本インターフェイス タイプがあります。
public interface IScripter<T> where T : IScriptable
{
IList<T> CollectScripts(params...)
}
public abstract class AbstractScripter<T> : IScripter<T> where T : IScriptable
{
....
}
public class TableScripter : AbstractScripter<Table>
{
....
}
public class ViewScripter : AbstractScripter<View>
{
....
}
ここまでは順調ですね。完全に理にかなったオブジェクト階層のようですね。ワイルドカードがないことがわかるまで、私が意図したことは次のとおりです。
public class Program
{
static void Main(string[] args)
{
// auto discover all scripter modules, table, view, etc
IList<Iscripter<? extends IScriptable>> allScripters = GetAllScripterModules();
foreach (IScripter<? extends IScriptable> scripter in allScripters)
{
IList<? extends IScriptable> scriptedObjects = scripter.CollectScripts(...);
// do something with scripted objects
}
}
}
ここ<? extends IScriptable>
には存在しないので、代わりに何をすべきですか?私は多くのこと、一般的な方法、基本型を使用するだけ、あらゆる種類の厄介なキャストを試しましたが、実際には何もうまくいきませんでした。
IList<Iscripter<? extends IScriptable>
部品を交換するために何を提案しますか?
ティア