3

基本型 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 のポリモーフィズムを無効にして、ジェネリック関数内に子クラス固有のコードを保持しているようです。

コードを繰り返さず、それによって子リストをベースリストとして扱うための真の抽象/汎用手段が存在することを願っています。

誰でもこれを達成する方法を教えてもらえますか?

ありがとうございました。

4

2 に答える 2