基本型 B と複数の派生子型 C1:B、C2:B、C3:B などがあります。
ListL1、ListL2、ListL3 の各子タイプのリストがあります。
私は、その子に対応するリストL1、L2、L3を取り、対応するタイプに対して本質的に同じ機能(Bのプロパティのみを扱う)を達成する、各子タイプの作業関数F1、F2、F3を持っています、C1、C2、C3。
基本型のリストに基づいて単一の関数を作成したいのですが、リストは「多態的に」子の型に依存しない関数を実行します。
次のようなテンプレート指定子を使用して関数宣言を修正することで、リストを関数に渡すことができるはずです。
public void Fn<T>(List<T> BList) { /* do stuff */ }
子関数 F1、F2、F3 のそれぞれに、次のような Base 関数を呼び出すようにします。
public void F1(List<C1> L1)
{
Fn(L1); // this is the line that fails
}
ベースタイプBとしてリキャストしてみた
Fn( (List<B>)L1 );
しかし、C1 が B から派生したにもかかわらず、型 'System.Collections.Generic.List' を 'System.Collections.Generic.List' に変換できないというエラーが表示されます。
また、Fn 名に型を挿入しようとしました。
Fn<C1>( L1 );
Fn<C1>( (List<B>)L1 );
子リストを基本クラス リストとしてキャストし (これは失敗します)、汎用関数 Fn 内で、渡されたリストが特定の型であるかどうかを確認し、それに固有の別のコードを実行する必要があるという推奨事項を見つけました。タイプ。キャストが推奨どおりに機能しないことに加えて、それは OOP のポリモーフィズムを無効にして、ジェネリック関数内に子クラス固有のコードを保持しているようです。
コードを繰り返さず、それによって子リストをベースリストとして扱うための真の抽象/汎用手段が存在することを願っています。
誰でもこれを達成する方法を教えてもらえますか?
ありがとうございました。