如何创建支持任意ResourceType的ResourceStorage泛型类集合?
解决方案
1. 新增非泛型标记接口
给所有泛型ResourceStorage实例定义一个非泛型的公共接口,作为集合存储的统一类型,这样就能容纳任意ResourceType的ResourceStorage实例。
示例代码:
// 定义非泛型标记接口,无需任何成员 public interface IResourceStorage { } // 让泛型ResourceStorage实现这个接口 public class ResourceStorage<ResourceType> : SpacecraftProperty<ResourceStorage<ResourceType>>, IResourceStorage where ResourceType : ResourceInfo { // 保留你原有的实现逻辑 } // 现在可以创建统一的集合 var allStorages = new List<IResourceStorage>(); // 任意ResourceType的实例都能加进去 allStorages.Add(new ResourceStorage<FuelResource>()); allStorages.Add(new ResourceStorage<OxygenResource>());
2. 调整继承链复用非泛型基类
如果你的SpacecraftProperty<T>原本没继承非泛型的SpacecraftProperty,可以修改继承关系,让泛型类继承自非泛型基类,这样直接用非泛型基类作为集合的元素类型。
示例代码:
// 非泛型抽象基类 public abstract class SpacecraftProperty { } // 泛型抽象类继承非泛型基类 public abstract class SpacecraftProperty<T> : SpacecraftProperty { } // ResourceStorage保持原有泛型继承 public class ResourceStorage<ResourceType> : SpacecraftProperty<ResourceStorage<ResourceType>> where ResourceType : ResourceInfo { // 你的实现代码 } // 直接用非泛型基类集合存储 var allStorages = new List<SpacecraftProperty>();
3. 协变接口(需访问泛型成员时用)
如果后续需要从集合中取出实例并访问ResourceType相关的属性/方法,可以定义一个协变接口,这样集合能兼容所有ResourceInfo的子类实例。
示例代码:
// 带out关键字的协变接口,允许子类接口赋值给父类接口 public interface IResourceStorage<out ResourceType> where ResourceType : ResourceInfo { // 只定义只读成员,协变不支持写入操作 ResourceType GetResourceInfo(); } // 让ResourceStorage实现该协变接口 public class ResourceStorage<ResourceType> : SpacecraftProperty<ResourceStorage<ResourceType>>, IResourceStorage<ResourceType> where ResourceType : ResourceInfo { public ResourceType GetResourceInfo() { // 返回对应ResourceType的实例 return default; } // 其他实现逻辑 } // 集合类型用父类接口 var allStorages = new List<IResourceStorage<ResourceInfo>>(); // 子类ResourceType的实例可以直接添加 allStorages.Add(new ResourceStorage<FuelResource>());
内容的提问来源于stack exchange,提问作者user2758663
相关产品推荐
相关产品推荐

