我目前正在启动一个新项目,但遇到了一个readblock。我希望有人能帮助我,我会尽力描述问题。
我有一个称为“ EntityBase”的基础抽象类。该类大约有100个左右的继承类。 EntityBase有许多方法,例如Load()和Save(),这些方法对于我所有继承的类都是通用的。它还具有几个接受整数或IDataReader的构造函数,这些构造函数用于从数据库中加载对象。
一切都很好。
输入名为EntityCollectionBase的新基类,它扩展了List 。我正在尝试为其编写Load函数,但不确定如何继续。希望这段代码可以更好地说明我的目标:
public bool Load()
{
bool result = true;
using (IDataReader reader = _dbManager.ExectureReaderSProc(this.LoadProcedure, new SqlParameter[] { new SqlParameter("@parentId", _parentID) }))
{
this.Add(new EntityBase(reader)); // WON'T WORK, EntityBase IS ABSTRACT
}
return result;
}
如您所见,我需要Load函数以通用方式工作以处理扩展EntityBase的所有内容,但是由于EntityBase是抽象的,因此我无法实例化它。
有任何想法吗?
谢谢,
桑尼
最佳答案
每当您基于运行时数据创建几种可能的类之一的实例时,工厂就是答案:
public interface IEntityFactory
{
EntityBase CreateEntity(IDataReader reader);
}
您将修改加载类以接受以下一种:
private readonly IEntityFactory _entityFactory;
public Loader(IEntityFactory entityFactory)
{
_entityFactory = entityFactory;
}
然后,您可以在
Load
方法中使用工厂:public void Load()
{
using(var reader = _dbManager.ExectureReaderSProc(this.LoadProcedure, new SqlParameter[] { new SqlParameter("@parentId", _parentID) }))
{
Add(_entityFactory.CreateEntity(reader));
}
}