ホームページ > バックエンド開発 > C++ > C# でオープン ジェネリック型を使用してポリモーフィズムを実現するにはどうすればよいですか?

C# でオープン ジェネリック型を使用してポリモーフィズムを実現するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-11 06:46:41
オリジナル
205 人が閲覧しました

How Can I Achieve Polymorphism with Open Generic Types in C#?

C# のオープン ジェネリック型を使用したポリモーフィズム

汎用コードを扱うときは、通常、さまざまな種類のデータを操作する必要があるシナリオに遭遇します。ただし、オープン ジェネリック型の処理に関しては、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# は、オープン ジェネリック型の真のポリモーフィズムをサポートしていません。この問題を解決するには、いくつかのオプションがあります:

  1. オブジェクトのリストを作成します:

    <code class="language-csharp"> List<object> dataCollection = new List<object>();
    
     dataCollection.Add(new DecimalData());
     dataCollection.Add(new StringData());</code>
    ログイン後にコピー

    ただし、このアプローチでは型の安全性が失われ、データにアクセスするときに明示的な変換が必要になります。

  2. 非汎用インターフェイスまたは抽象クラスを使用します:

    <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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート