如何实现支持多Feature子类的泛型FeatureCollection类?避免为每个子类单独定义集合类
解决方案:用泛型FeatureCollection实现复用
当然可行!完全不需要为每个继承自Feature的子类单独创建专属的FeatureCollection——泛型就是专门用来解决这种「同结构、不同类型元素」的复用场景的。
具体实现步骤
改造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>(); // 建议初始化避免空引用异常 }使用泛型集合存储不同子类对象
当你需要存储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
相关产品推荐
相关产品推荐

