将子类作为基类的构造函数参数传递

时间:2018-12-27 16:37:58

标签: c#

我有两个孩子班

public class SampleFormBL_WEB : SampleFormBL
{ } 

public class SampleFormBL_API : SampleFormBL
{ }

继承基类

public abstract class  SampleFormBL
{
    SampleFormDA objSampleFormDA;

    public SampleFormBL()
    {
        objSampleFormDA = new SampleFormDA_WEB();
    }
}

并且我想将子类引用传递给调用方法的父类。以便SampleFormDA的初始化可以动态完成。

有时候

objSampleFormDA = new SampleFormDA_WEB();

有时

objSampleFormDA = new SampleFormDA_API();

请建议我在哪里以及如何将子类作为参数传递给基类。

1 个答案:

答案 0 :(得分:0)

您可以修改基类以接受数据访问类:

public abstract class SampleFormBL
{
    SampleFormDA objSampleFormDA;

    public SampleFormBL(SampleFormDA da)
    {
        objSampleFormDA = da;
    }
}

您的业务逻辑类然后可以将数据访问类作为参数传递:

public class SampleFormBL_WEB : SampleFormBL
{
    //Passing the da into the constructor
    public SampleFormBL_WEB(SampleFormDA da):base(da)
    {

    }

    //Defaulting to a type of da
    public SampleFormBL_WEB():base(new SampleFormDA_WEB())
    {

    }
}

如您所见,我提供了两个构造函数。第一个接受DA。第二个将默认为特定类型的da。现在,当您使用第一个构造函数时,有趣的事情变得显而易见:

//The DALs
var webDa = new SampleFormDA_WEB();
var apiDa = new SampleFormDA_API();

//The constructors
var bl = new SampleFormBL_WEB(webDa);
var bl2 = new SampleFormBL_WEB();

//You probably don't want this to happen
//A Web BL with an API DAL
var bl3 = new SampleFormBL_WEB(apiDa);

但是,这更多是一个语义问题。注入依赖项可以更好地进行单元测试,因此我将注入保持在基类上,但从类中消除了第一个构造函数,因此您可以限制用法:

public class SampleFormBL_WEB : SampleFormBL
{
    //Defaulting to a type of da
    public SampleFormBL_WEB():base(new SampleFormDA_WEB())
    {

    }
}

另一种选择是添加泛型和约束,以便您仅允许预期的类型以及从其派生的将来的类:

public class SampleFormBL_WEB<TDal> : SampleFormBL where TDal : SampleFormDA_WEB
{
    //Passing the da into the constructor
    public SampleFormBL_WEB(TDal da) 
        :base(da) 
    {

    }

    //Defaulting to a type of da
    public SampleFormBL_WEB():base(new SampleFormDA_WEB())
    {

    }
}

我建议改为使用接口,但这主要是一个见解。