2009-11-20 262 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