gpt4 book ai didi

c# - 使两个并行继承结构跨层交互的方法

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:54 25 4
gpt4 key购买 nike

我有一个问题,我在业务层中有一组对象,它们之间具有继承结构,并且我还有一组支持它们的 DAL 对象,它们具有大致平行的继承结构。我遇到的问题是 DAL 类型必须在 BOL 继承的多个级别上被理解,例如,一个基础业务对象必须能够访问基础 DAL 对象属性,但是相同的属性必须稍后提供特定实例。

由于 C# 不支持返回协变,我不能简单地在覆盖声明中使用更具体的类型。我也无法使用泛型,因为我必须对类型进行具体说明才能使用它,并且由于相同的返回协方差原因,这会破坏进一步的继承。到目前为止,我能想到的唯一解决方案似乎非常可怕,所以我想将其张贴在这里以征求反馈或其他想法。

这似乎可以通过定义一个通用接口(interface)来解决IHasDal<TDalType> .然后我可以指定 BOLBase : IHasDal<BaseDAL> .然后这需要在 BOLBase 上实现 .Dal 属性。对于 BolChild,它被声明为 BOLChild : BOLBase, IHasDal<ChildDAL>然后指定一个 .Dal ChildDAL 类型的属性.虽然这两个命令不相关并且特定于它们所在的类级别,但我通过在 BOLBase 中有一个私有(private)字段将它们链接起来。类型 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;
}
}
}

最佳答案

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

关于c# - 使两个并行继承结构跨层交互的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12302890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com