c#继承类初始化

时间:2009-11-20 02:23:07

标签: c# inheritance override virtual-functions

所以我有这个课

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

我希望steps包含在覆盖中,因此steps现在将true而不是false(默认值)。

如果有可能,请给出一些关于如何修复此问题的指示和提示,并向我解释为什么我的设置不允许在构造函数init之后发生覆盖。

3 个答案:

答案 0 :(得分:0)

我想您忘了向我们展示Options类构造函数,但我猜它会调用createOptions()方法。

在C#中,你无法在任何地方调用基础构造函数。在给定构造函数启动之前始终调用基础构造函数。您可以参考此URL以了解有关构造函数链接的更多信息:

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

但是你可以通过改变你的架构来获得你想要的东西。我看到这一点,您的options属性是Options类的ToString()。您不需要在构造函数时准备好此属性。

一些选项:

  1. 在选项get accessor中将Options类转换为字符串。
  2. 消除options属性,而是实现一个调用createOptions或仅调用内容的toString方法

答案 1 :(得分:0)

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

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

编辑。我没注意到步骤是静态的。然后我不明白为什么你在实例构造函数中设置它。

答案 2 :(得分:0)

以下是使用public static bool steps等静态类成员时的一些提示:

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

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

  3. 快速Google搜索C#静态成员可能会有所帮助: Link to C# Help on Static Members