【问题标题】:base class list<type> property to/from derived class list<derivedType> property基类列表<type> 属性到/来自派生类列表<derivedType> 属性
【发布时间】:2014-02-06 01:26:55
【问题描述】:

无法完全弄清楚基础/派生List&lt;type&gt; 的动态。主项目“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;
        }

有没有更优雅的方式?

【问题讨论】:

    标签: c# inheritance


    【解决方案1】:

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

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

    因此,该语言并非旨在让您这样做,因为它不安全; 您正试图缩小(而不是扩展)基类的行为。这通常是code smell。您必须明确地执行此操作,并且只有在您知道这既安全又适合您的特定问题时才

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

    【讨论】:

    • 非常有帮助...谢谢。是的,这是一种特殊情况,其中由于派生静态方法,必须在派生中作为派生属性访问基本属性。因此,派生属性现在具有唯一的名称,一切都很好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多