2014-07-15 30 views
1

我有一個類似這樣的問題:Can I have a base class where each derived class has its own copy of a static property?,但那裏的答案對我來說似乎沒有定論。如何在派生類時更改常量或靜態變量的值?

基本上,我有一個類有一個常量屬性,我想派生一個類具有所有相同的方法,但爲變量使用不同的值。舉個簡單的比喻,想象我有一個類,它看起來在某種程度上,這樣的:

public class Triangle 
{ 
    public const NumSides = 3; 
    int sideLength; 

    public int Perimeter() 
    { 
     return NumSides * sideLength; 
    } 
} 

,現在我想做一個Square類,這是完全一樣的三角班,除了即numSides現在4。

換句話說,我希望有一個類,現在看起來,其全部是這樣的:

public class Square : Triangle 
{ 
    public const NumSides = 4; 
} 

但仍然可以訪問三角類的所有方法。 (如果有必要,我可以處理寫一個新的構造函數,但我不想從原始類複製十幾種方法,它們都應該表現得完全一樣,但是NumSides現在有一個值4.)

我不知道如何做到這一點,無論是NumSides是一個常量或作爲一個靜態屬性只有一個get函數。如果我嘗試覆蓋常量,則會得到「修飾符'覆蓋'對此項無效。」當我嘗試重寫靜態屬性版本時,我得到的消息等價於「一個靜態成員Triangle.NumSides不能被標記爲重寫,虛擬或抽象。」

而且,是的,我已經嘗試創建一個Shape類,將所有功能放在那裏,然後讓Triangle和Square從該類繼承。雖然我遇到了與NumSides相同的問題。如何在派生一個新類時更改常量或靜態變量/屬性的有效值?

+4

正方形是一種三角形?我認爲我的腦袋有點爆炸。 –

回答

3

而且,是的,我嘗試過創建一個Shape類,將所有功能放在那裏,然後同時從這個類繼承三角形和方形。

這是正確的做法。 A Square不是Triangle,不應將其繼承。

雖然我遇到了與NumSides相同的問題。如何在派生一個新類時更改常量或靜態變量/屬性的有效值?

您不能使用靜態變量。您需要使用非靜態屬性,但如果您選擇的話,它們可以是由本地常量支持的屬性。話雖這麼說,這裏給出的簡單,我只是做:

public abstract class Shape 
{ 
    public abstract int NumSides { get; } 
    // Other functionality... 
} 

覆蓋通過:

public override int NumSides { get { return 3; } } // For triangle 
+0

這很好,謝謝。唯一的問題是,它完全混淆了我的大部分靜態方法,因爲現在我不能再引用這些方法中的常量了。這有點超出了我提出的問題的範圍,但對於這個解決方案來說,這是一個重要的副作用,它確實值得一提。 – Galendo

1

要覆蓋它必須是虛擬的成員,和恆定或靜態的不能虛擬。使它成爲一個屬性,而不是:

public class Triangle 
{ 
    public virtual int NumSides { get { return 3; } } 

    int sideLength; 

    public int Perimeter() 
    { 
     return NumSides * sideLength; 
    } 
} 

public class Square : Triangle 
{ 
    public override int NumSides { get { return 4; } } 
} 

同樣的方法將工作一Shape類,但你可能希望把它的虛擬抽象insetad,以避免在Shape類屬性的實現。