具有两个并行继承结构的方法跨层级交互

时间:2012-09-06 14:58:17

标签: c# oop generics inheritance interface

我遇到一个问题,我在业务层中有一组对象,它们之间有一个继承结构,我还有一组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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这里的正确答案似乎是,有一个像这样的两个并行层,其中一个为另一个提供检索是一个坏主意。关于一方返回类型的泛型可用于满足许多需求,但由于与泛型相关的共同/逆向问题,使用泛型的方面的功能存在一些非常严重的限制。