2009-11-20 165 views
0

所以用这个类我有C#继承类初始化

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(它的默认值)。

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

+0

此代码不能编译。你可以从createOptions中调用'createTypeOptions',但是基本没有功能,并且基础没有构造函数需要4个参数。 – 2009-11-20 02:47:47

+0

抱歉createTypeOptions应该是createOptions当我复制代码到stackoverflow我一定错过了。以及忘记选项构造函数 – Ayo 2009-11-21 14:36:51

+0

是否有任何理由让步骤为静态? – 2012-02-18 16:37:48

回答

0

我想你忘了告诉我们Options类的构造函数,但我想它叫做createOptions()方法。

在C#中,您无法在任何地方调用基础构造函数。基础构造函数在给定的构造函数启动之前总是被调用。你可以参考这个网址了解更多关于构造函数链:

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

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

一些选项:

  1. 转换选项类字符串中的选项get访问。
  2. 消除选项属性,相反,实施这将要求createOptions一个toString方法或只是它的内容
+0

真棒链接真的帮助我,我改变了公共静态布尔不是静态它不需要。我几乎在我的继承类构造函数中调用覆盖函数,并解决了我的问题,我注意到它在我的基类中被调用,我忘记在我的上例中发布它的那部分。 – Ayo 2009-11-21 15:32:46

0

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

有很多方法可以解决这个问题,但你应该做的第一件事是避免在构造函数中调用虚拟方法。我会这样做的方式是使选项属性为只读,并使其getter虚拟,以便它在需要时计算值。

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

0

因此,这里有一些提示与静态类成员的工作就像public static bool steps时:

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

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

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