汎用コードを扱うときは、通常、さまざまな種類のデータを操作する必要があるシナリオに遭遇します。ただし、オープン ジェネリック型の処理に関しては、C# のジェネリック ポリモーフィズムには制限があります。
次のコードを考えてみましょう:
<code class="language-csharp">public abstract class Data<T> { } public class StringData : Data<string> { } public class DecimalData : Data<decimal> { } List<Data<T>> dataCollection = new List<Data<T>>(); // 错误:缺少类型参数 dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
この例では、さまざまなデータ サブタイプのインスタンスを保持できるリストを作成します。ただし、オープン ジェネリック型 (Data など) では型パラメーターを指定する必要があるため、最後の行はコンパイラ エラーで失敗します。
C# は、オープン ジェネリック型の真のポリモーフィズムをサポートしていません。この問題を解決するには、いくつかのオプションがあります:
オブジェクトのリストを作成します:
<code class="language-csharp"> List<object> dataCollection = new List<object>(); dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
ただし、このアプローチでは型の安全性が失われ、データにアクセスするときに明示的な変換が必要になります。
非汎用インターフェイスまたは抽象クラスを使用します:
<code class="language-csharp"> public interface IData { void SomeMethod(); } public abstract class Data<T> : IData { public void SomeMethod() { } } List<IData> dataCollection = new List<IData>(); dataCollection.Add(new DecimalData()); dataCollection.Add(new StringData());</code>
これにより、ジェネリック性と型安全性はある程度犠牲になりますが、リスト要素に対する非ジェネリック操作が可能になります。
C# でオープン ジェネリック型を使用する場合の制限とトレードオフを理解し、特定のニーズに最適なソリューションを選択することが重要です。
以上がC# でオープン ジェネリック型を使用してポリモーフィズムを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。