在處理泛型程式碼時,通常會遇到需要操作各種類型資料的場景。但是,在處理開放泛型類型時,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#不支援開放泛型類型的真正多態性。為了克服這個問題,您可以選擇以下幾種方法:
建立物件清單:
<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中文網其他相關文章!