我遇到一个问题,我在业务层中有一组对象,它们之间有一个继承结构,我还有一组DAL对象支持它们,它们具有大致平行的继承结构。我遇到的问题是必须在BOL继承的多个级别上理解DAL类型,例如,基本业务对象必须能够访问基本DAL对象属性,但是同一属性必须在以后提供特定实例。 / p>
由于C#不支持返回协方差,因此我无法在覆盖声明中简单地使用更具体的类型。我也无法使用泛型,因为我必须对类型的具体规范进行使用,并且为了相同的返回协方差原因而打破了进一步的继承。到目前为止,我能够提出的唯一解决方案似乎非常可怕,所以我想在这里发布反馈或其他想法。
似乎可以通过定义通用接口IHasDal<TDalType>
来解决这个问题。然后我可以指定BOLBase : IHasDal<BaseDAL>
。然后,这需要在BOLBase上实现.Dal属性。对于BolChild,它被声明为BOLChild : BOLBase, IHasDal<ChildDAL>
,然后指定.Dal
类型为ChildDAL
的属性。虽然这两个命令与它们所在类的级别无关且具体,但我通过在BOLBase
类型为BaseDAL
的私有字段来链接它们。然后,我可以通过AS为每个子属性实现投射它。
从理论上讲,似乎这应该给我提供我所需要的最小问题。它可用于实现我指定的任何类型的IHasDal
的对象或任何给定的BOLBase
派生类的对象。它仍然感觉很难看,因为它似乎有效地依赖于方法隐藏,但我想不出更好的东西。
public interface IHasDal<TDalType>
where TDalType : BaseDal
{
TDalType Dal { get; set; }
}
public class BaseDal
{
}
public class BaseEntity : IHasDal<BaseDal>
{
protected BaseDal _dal;
public BaseDal Dal
{
get
{
return (BaseDal)_dal;
}
set
{
_dal = value;
}
}
}
public class ChildDal : BaseDal
{
}
public class ChildEntity : BaseEntity, IHasDal<ChildDal>
{
public ChildDal Dal
{
get
{
return this._dal as ChildDal;
}
set
{
this._dal = value;
}
}
}
答案 0 :(得分:0)
这里的正确答案似乎是,有一个像这样的两个并行层,其中一个为另一个提供检索是一个坏主意。关于一方返回类型的泛型可用于满足许多需求,但由于与泛型相关的共同/逆向问题,使用泛型的方面的功能存在一些非常严重的限制。