我目前正在启动一个新项目,但遇到了一个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));
    }
}

10-05 23:52