泛型类定义:类型参数';s在抽象方法中使用的类型参数

本文关键字:类型参数 抽象方法 定义 泛型类 | 更新日期: 2023-09-27 18:21:35

我根本不确定在这里使用什么关键字,但是:我正在尝试为实体和集合创建泛型基类,但不知道如何将KeyType类型传递给EntityCollection的抽象方法。问题的所有部分都打上问号。

public abstract class Entity<KeyType> {
        public KeyType id;
        public Entity(KeyType id) {
                this.id = id;
        }
}
public class Product: Entity<string> {} // Product has a string identifier
public abstract class EntityCollection<EntityType> : Where EntityType:Entity<?> {
        public abstract EntityType Get(?keytype? id);
        public abstract void Add(EntityType entity);
        public abstract IEnumerable<EntityType> GetAll();
}
public class Inventory : EntityCollection<Product> {
        public Product Get(?keytype? id) { ... }
        public void Add(Product item) { ... }
        ...
}
....
var productCode = "12345";
var list = new Inventory();
list.Add(new Product(productCode));
var foundproduct = list.Get(productCode);

我是从错误的角度看待这个问题,还是遗漏了什么?我可以做EntityCollection<EntityType,KeyType> : Where EntityType:Entity<KeyType>,但我觉得信息已经存在于定义中,这只是重复它,使定义过于复杂。

(实际的代码也有接口,我试着把它缩短)

泛型类定义:类型参数';s在抽象方法中使用的类型参数

解决这一问题的关键是要意识到EntityCollection需要更多的类型信息,以便您可以指定您所拥有的类型?'s:

public abstract class EntityCollection<EntityType, T> where EntityType : Entity<T>
    {
        public abstract EntityType Get(T id);
        public abstract void Add(EntityType entity);
        public abstract IEnumerable<EntityType> GetAll();
    }

Inventory变为:

public class Inventory : EntityCollection<Product, string>
{
    public override Product Get(string id) { ... }
    public override void Add(Product item) { ... }
    ...
}