c#继承类初始化

c#继承类初始化,c#,inheritance,overriding,virtual-functions,C#,Inheritance,Overriding,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 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; }
    }
调用对象
行(true,1,true,Color.Gray,true)
时,它首先重写继承的类函数,然后将
步骤设置为
true

我希望覆盖中包含
步骤
,因此
步骤
现在将为
,而不是
(其默认值)


如果可能的话,请给我一些关于如何修复此问题的指针和提示,并向我解释为什么我的设置不允许在构造函数初始化后发生重写。

我想你忘了向我们展示
选项
类构造函数,但我想它调用
createOptions()
方法

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

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

一些选择:

  • 在选项获取访问器中将选项类转换为字符串
  • 消除options属性,而是实现一个toString方法,该方法将调用createOptions或仅调用其内容

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

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


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

    因此,在处理静态类成员时,如
    公共静态bool步骤
    ,这里有一些提示:

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

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

  • 在谷歌上快速搜索C#静态成员可能会有所帮助:

    此代码无法编译。您从createOptions调用“createTypeOptions”,但基尚未运行,并且基没有接受4个参数的构造函数。很抱歉,createTypeOptions应该是createOptions,当我将代码复制到stackoverflow时,我一定错过了这一点。也忘了选项构造器有什么理由让步骤成为静态的吗?棒极了的链接真的帮了我我把公共静态bool改成了非静态的它不需要是静态的。我几乎在继承的类构造函数中调用了override函数,解决了我的问题。我注意到它是在基类中调用的,我忘了在上面的示例中发布它的这一部分。