You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现支持多Feature子类的泛型FeatureCollection类?避免为每个子类单独定义集合类

解决方案:用泛型FeatureCollection实现复用

当然可行!完全不需要为每个继承自Feature的子类单独创建专属的FeatureCollection——泛型就是专门用来解决这种「同结构、不同类型元素」的复用场景的。

具体实现步骤

  1. 改造FeatureCollection为泛型类
    给FeatureCollection添加泛型参数,并通过where约束确保该参数必须是Feature的子类:

    public class FeatureCollection<T> where T : Feature
    {
        public string Type { get; set; }
        public List<T> Features { get; set; } = new List<T>(); // 建议初始化避免空引用异常
    }
    
  2. 使用泛型集合存储不同子类对象
    当你需要存储FirstClass对象时,直接实例化FeatureCollection<FirstClass>;需要存储SecondClass时,用FeatureCollection<SecondClass>即可:

    // 存储FirstClass的示例
    var firstFeatureCollection = new FeatureCollection<FirstClass>
    {
        Type = "SomeType",
        Features = new List<FirstClass>
        {
            new FirstClass { Id = "20", Type = "FeatureType", FirstClassKey = "12" }
        }
    };
    
    // 存储SecondClass的示例
    var secondFeatureCollection = new FeatureCollection<SecondClass>
    {
        Type = "SomeType",
        Features = new List<SecondClass>
        {
            new SecondClass { Id = "20", Type = "FeatureType", SecondClassKey = "48" }
        }
    };
    

为什么这能满足你的需求?

  • 泛型约束where T : Feature保证了所有T类型的对象都拥有Feature基类的Id和Type属性;
  • 同时T可以是任意Feature的子类,所以每个元素会保留自己的特有属性(比如FirstClassKey或SecondClassKey);
  • 序列化后的JSON结构会完全符合你期望的样子——包含基类属性和子类特有属性。

额外小提示

如果有场景需要处理「不确定具体子类类型」的集合,你可以额外定义一个非泛型的基类,或者直接使用FeatureCollection<Feature>。不过这种情况下访问子类特有属性时需要先做类型转换,所以如果大部分场景是明确知道子类类型的,泛型版本会更安全、更方便。

内容的提问来源于stack exchange,提问作者novafluff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:22:28