我有两个孩子班
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();
请建议我在哪里以及如何将子类作为参数传递给基类。
答案 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())
{
}
}
我建议改为使用接口,但这主要是一个见解。