【问题标题】:Derived classes containing lists of other subclasses包含其他子类列表的派生类
【发布时间】:2017-01-18 22:37:57
【问题描述】:

我有一个带有派生类的抽象类:

abstract class FoxObject : ICloneable
    {
        public int lineNumber;
        public string line, name;
        public FoxObject parent;
        public List<FoxObject> children;
        private Guid guid;

        protected FoxObject(int lineNumber, string line, string name, FoxObject parent, List<FoxObject> children)
        {
            this.lineNumber = lineNumber;
            this.line = line;
            this.name = name;
            this.parent = parent;
            this.children = children;
            guid = Guid.NewGuid();
        }

     //Code not relevant to this question.
    }

从中我有几个派生类(全部直接继承自FoxObjectSymbolGraphicAliasActionUpdate

每个Graphic 包含一个List&lt;Symbol&gt; 每个符号一个包含别名、操作和更新的列表(或三个单独的列表,这是问题的一部分)。然而目前,这些都由父类中的List&lt;FoxObject&gt; 处理,因此存在高级别的多态性。

我的问题是,有没有办法在派生类中指出 List&lt;FoxObject&gt; 实际包含的内容,以节省每次都必须转换它?

如果不是,那么让这些List&lt;T&gt;s 具有相同的名称但不同的types 并将其从FoxObject 类中删除是否有意义?

【问题讨论】:

  • 听起来你不应该从 FoxObject 派生。显然,当SymbolFoxObject 有不同的成员时,它们不应该属于同一个继承链。改为考虑组合,这意味着 Symbol 具有三个对FoxObject 的引用 - 一个用于Graphics,一个用于Alias,一个用于Action
  • Symbol 有 3 个不同的列表吗?别名、操作和更新?
  • 是这样还是你想要这样?我不知道,但从你写的Symbol shpuld 引用了另一个FoxObject,而不是FoxObject 不知道List&lt;Alias&gt; 的任何东西,但是Symbol 知道。
  • @MaksimSimkin 它可以做,或者List&lt;FoxObject&gt; children`可以包含所有这三个。这是问题的一部分(可能没有问得不够清楚)。
  • 但是你写了一个Symbol 有三个列表而不是一个。

标签: c# oop inheritance


【解决方案1】:

我的答案是只使用new 关键字并覆盖基类的成员字段:

// no changes with the base class
abstract class FoxObject : ICloneable
{
    public int lineNumber;
    public string line, name;
    public FoxObject parent;
    public List<FoxObject> children;
    private Guid guid;

    protected FoxObject(int lineNumber, string line, string name, FoxObject parent, List<FoxObject> children)
    {
        this.lineNumber = lineNumber;
        this.line = line;
        this.name = name;
        this.parent = parent;
        this.children = children;
        guid = Guid.NewGuid();
    }

 //Code not relevant to this question.
}

// example Graphic object
class Graphic : FoxObject
{
    public new List<Symbol> children; // like this.
}

【讨论】:

  • New 不会覆盖,它会影响成员。如果您执行FoxObject a = new Graphic(...),则执行a.children 将为您提供基本列表,而不是Graphic 中的列表
  • @ScottChamberlain 它“阴影”?我知道它只会为派生对象生成“新方法”(就像其他人都知道的那样)你真的应该阅读this article
  • 阴影这个术语是一个较旧的术语that comes from visual basic,但它在 C# 中经常用于表示相同的意思。
  • 我决定取消继承,因为在这种情况下它可能没有什么价值,我可能会在稍后为它们都需要实现的一些小方法添加一个接口。无论哪种方式,这个答案似乎都最好地回答了我的问题,所以我将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多