在java中,我可以使用通用类型中的extends关键字,但在C#中我无法理解。
我有3个类,其中一个是基类。
public class BaseEntity {
public string Id {get;set;}
}
public class EntityA : BaseEntity {}
public class EntityB: BaseEntity {}
然后我有一个数据集的模拟类。对于泛型类型,最小约束是BaseEntity
public class MockDataStore<T> : IDataStore<T> where T : BaseEntity
{
List<T> items = new List<T>();
public async Task<bool> AddAsync(T item)
{
}
public async Task<bool> UpdateAsync(T item)
{
}
public async Task<bool> DeleteAsync(T item)
{
}
}
但是当我想将其中一个子类添加到items
列表时,分析师说这是不可能的。
无法从EntityA转换为T
items.Add(new EntityA());
我想使用泛型类型,因为添加,更新和删除方法。
是的,如果我使用List<BaseEntity> = new List<BaseEntity>()
,那么我将无法获得无法转换消息。但在这种情况下,添加,更新和删除方法将是错误的。
但是我添加了where T : BaseEntity
这个约束和grr。
我想要实现的是T : BaseEntity
已键入的items
列表中填充了BaseEntity
的子项。
我该怎么做?
答案 0 :(得分:4)
我认为你有两种选择:
我不认为你在课堂上需要泛型。您可以拥有基类列表并使用它:
public class MockDataStore
{
List<BaseEntity> items = new List<BaseEntity>();
public async Task<bool> AddAsync(BaseEntity item)
{
}
public async Task<bool> UpdateAsync(BaseEntity item)
{
}
public async Task<bool> DeleteAsync(BaseEntity item)
{
}
}
这可能不是你想要的,因为你最终会得到多个课程,但为了以防万一,我会留在这里:
public abstract class MockDataStoreBase<T> : IDataStore<T> where T : BaseEntity
{
protected List<T> items = new List<T>();
public virtual async Task<bool> AddAsync(T item)
{
}
public async Task<bool> UpdateAsync(T item)
{
}
public async Task<bool> DeleteAsync(T item)
{
}
}
public class EntityADataStore : MockDataStoreBase<EntityA>
{
public override async Task<bool> AddAsync(EntityA item)
{
bool result = await base.AddAsync(item);
}
//...
}
现在,EntityADataStore.items
将是List<EntityA>
。