首頁 > 後端開發 > C++ > 如何在 C# 中透過開放泛型類型實現多態性?

如何在 C# 中透過開放泛型類型實現多態性?

Mary-Kate Olsen
發布: 2025-01-11 06:46:41
原創
204 人瀏覽過

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子類型的實例。但是,最後一行會因編譯器錯誤而失敗,因為開放泛型類型(例如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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板