gpt4 book ai didi

c# - 基类 list 属性到派生类 list 属性/从派生类 list 属性

转载 作者:行者123 更新时间:2023-11-30 22:09:25 25 4
gpt4 key购买 nike

不太清楚基础/派生的动态 List<type> .主项目“Derived”引用了“Base”项目。基础项目工作正常,模组需要保持在最低限度。派生项目仅添加与服务的交互,但本身不修改基本功能。

基类:

B1
{
private int _prop;
int prop
{
get{return _prop;}
set{_prop = value;}
}
}

B2
{
private List<B1> _list;
List<B1> list
{
get{return _list;}
set{_list = value;}
}
}

派生类:

D1:B1
{
int prop
{
get{return base.prop;}
set{base.prop = value;}
}
}

D2:B2
{
List<D1> list
{
get{return base.list;}/Problem area ... each base.B1 needs to be cast to a D1.
set{base.list = value;}//... each D1 needs to be cast back to a B1
}
}

base.list 中的每个 B1 都必须转换为 D1,以便使用 D1 的特定方法,这些方法又与外部服务交互。试过这个但我不确定这是一个更好的策略。 (存在重载构造函数来支持这一点。)

        get
{
List<D1> listD1 = new List<D1>();
foreach (B1 b in base.list)
{
listD1.Add(new D1(B1));
}
return _listD1;
}
set
{
List<B1> listB1 = new List<B1>();
foreach (D1 d in list)
{
listB1.Add(new B1(d.prop));
}
base.list = listB1;
}

有没有更优雅的方式?

最佳答案

没有,而且这种方法有潜在的危险。您可能需要重新评估您尝试做的事情。

B2.listB1 对象的集合。它的接口(interface)契约声明它包含B1。在派生类中,D2.listD1 对象的集合。由于 D1B1 的子类,因此这是一个更严格的要求。基类的列表完全有可能包含一个 B1 而不是 D1 的对象。在这种情况下,您的代码将因无效转换异常而失败。

所以该语言并不是为了让您这样做而设计的,因为它不安全; 您正在尝试缩小(而不是扩展)基类的行为。这通常是 code smell .您必须明确地执行此操作,并且如果您知道这对您的特定问题既安全又是一个好的设计。

此外,作为观察,请注意您是 "hiding" the base class's properties .编译器可能会就此向您发出警告。如果你想要一个真正的覆盖,你需要使基属性 virtual 并在派生类中使用 override 关键字。或者,使用 new 关键字来确认隐藏是您想要的,并消除警告,但请确保您理解这意味着什么(如果通过引用访问该属性,您将不会获得多态行为基类类型)。

关于c# - 基类 list<type> 属性到派生类 list<derivedType> 属性/从派生类 list<derivedType> 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21583942/

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