首页 >后端开发 >C++ >如何在 C# 中通过开放泛型类型实现多态性?

如何在 C# 中通过开放泛型类型实现多态性?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-11 06:46:41291浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn