代码之家  ›  专栏  ›  技术社区  ›  Ayo

继承类初始化

  •  0
  • Ayo  · 技术社区  · 15 年前

    所以在这节课上我有

    public class Options
        {
            public bool show { get; set; }
            public int lineWidth { get; set; }
            public bool fill { get; set; }
            public Color fillColour { get; set; }
            public string options { get; set; }
    
            public virtual void createOptions()
            {
                options += "show: " + show.ToString().ToLower();
                options += ", lineWidth: " + lineWidth;
                options += ", fill: " + fill.ToString().ToLower();
                options += ", fillColor: " + (fillColour != Color.Empty ? ColourToHex(fillColour) : "null");
            }
    
            public Options(bool _show, int _lineWidth, bool _fill, Color _fillColour)
            {
                show = _show;
                lineWidth = _lineWidth;
                fill = _fill;
                fillColour = _fillColour;
    
                createOptions();
            }
    }
    

    以及继承它的另一个类

    public class Line : Options
        {
            public static bool steps { get; set; }
    
            public override void createOptions()
            {
                options += ", lines: {";
                options += " steps: " + steps.ToString().ToLower() + ",";
                base.createOptions();
                options += "}";
            }
    
            public Line(bool _show, int _lineWidth, bool _fill, Color _fillColour, bool _steps)
                : base(_show, _lineWidth, _fill, _fillColour) { steps = _steps; }
        }
    

    调用对象时 Line(true, 1, true, Color.Gray, true) 它先重写继承的类函数,然后设置 steps true .

    我想要 步骤 将包含在重写中,因此 步骤 现在将 而不是 false (默认)。

    如果可能的话,请给我一些关于如何修复此问题的指针和提示,并向我解释为什么我的安装程序不允许在constructor init之后发生重写。

    3 回复  |  直到 15 年前
        1
  •  0
  •   Robert Harvey    15 年前

    我想你忘了给我们看 Options 类构造函数,但我想它调用 createOptions() 方法。

    在C中,您不能随意调用基本构造函数。基本构造函数总是在给定的构造函数启动之前调用。您可以参考此URL了解有关构造函数链接的更多信息:

    http://www.yoda.arachsys.com/csharp/constructors.html

    但是你可以通过稍微改变你的架构来得到你想要的。正如我看到的,你的 options 属性是 ToString() 选项类的。您不需要在构造函数时准备好这个属性。

    一些选项:

    1. 在options get访问器中将options类转换为string。
    2. 消除Options属性,而是实现一个ToString方法,该方法将调用CreateOptions或其内容
        2
  •  0
  •   Matt    15 年前

    在处理静态类成员时,这里有一些提示,比如 public static bool steps :

    1. 第一次加载类时,静态成员初始化为其默认值(在本例中为false)。请记住,静态成员属于类而不是实例,因此它们不能被重写,但可以通过使用 new 关键字。

    2. 可以使用称为静态构造函数的特殊构造函数显式初始化静态类成员…因此,您不应该在代码片段所示的实例构造函数中尝试初始化它们。

    对C静态成员进行快速的谷歌搜索可能会有所帮助: Link to C# Help on Static Members

        3
  •  0
  •   user135033    15 年前

    我在代码中看不到Options类的构造函数,但我猜它首先将四个给定参数复制到相应的字段,然后调用CreateOptions来初始化Options字段。这实际上是一个很好的例子,说明了为什么在构造函数中调用虚拟方法是一种糟糕的实践。在基类的构造函数完成之前,无法设置派生类的任何字段,因此重写的方法将使用步骤字段的默认值。

    有很多方法可以解决这个问题,但首先应该避免在构造函数中调用虚拟方法。我这样做的方法是将Options属性设为只读,并使其getter为虚拟的,以便在需要时计算值。

    编辑。我没注意到台阶是静止的。那么我不明白为什么要在实例构造函数中设置它。