2011-02-20 53 views
4

我有類似下面的下面的情況:我可以有一個基類,其中每個派生類都有自己的靜態屬性副本?

class Base 
{ 
    public static int x; 
    public int myMethod() 
    { 
      x += 5; 
      return x; 
    } 

} 

class DerivedA : Base 
{ 
} 

class DerivedB : Base 
{ 
} 

我想此設置,使每個派生類x的自己的靜態實例,如果我做這樣的事情:

DerivedA.x = 5; 
DerivedB.x = 10; 

然後當我運行:

DerivedA.myMethod(); //The result will be 10 
DerivedB.myMethod(); //The reusult will be 15 

我可以做這樣的事情?我如何設置派生類來實現這一目標?多謝你們。

編輯:基本上,我有一堆派生類,每個都有一個屬性,該類是唯一的。它並不因每個實例而異,因此我認爲它應該是一個靜態變量。此外,該屬性由一個方法設置,對於每個類都是相同的。 我試圖避免在每個派生類中複製和粘貼該屬性和方法的邏輯。我認爲最好的辦法是把這個邏輯轉移到每個類都從中派生出來的基類。但是,我需要每個派生類都擁有該屬性的副本。 我不一定非要這樣做,如果你們有任何建議,我會很高興聽到一些更好的做法建議..謝謝!

回答

5

您將需要重新定義和隱藏所有派生類型中的字段和方法。

例子:

class DerivedA : Base 
{ 
    public new static int x; 
    public new int myMethod() 
    { 
    x += 5; 
    return x; 
    } 
} 

注意:不要做這種方式。修復你的設計。

編輯:

其實,我有一個類似的構造。我解決這個問題有一個抽象的(如果你需要一個缺省值,使用virtual),然後把它從基類使用性質:

public abstract class Base 
{ 
    public abstract string Name { get; } 

    public void Refresh() 
    { 
    //do something with Name 
    } 
} 

public class DerivedA 
{ 
    public override string Name { get { return "Overview"; } } 
} 

你應該能夠調整,對你的使用情況。如果只有派生類應該能夠看到它,您當然可以創建該屬性protected

+0

那麼,什麼是避免在每個派生類中重複代碼的最佳方法?該方法對於我的每個派生類都是相同的。 – ntsue

+1

請修改您的問題以顯示您想要實現的內容。我們將能夠以這種方式幫助你。 – Femaref

+0

@Femaref,編輯 – ntsue

9

嗯,是的,你可以,但它圍繞着泛型的一個小竅門。

這是好多了,如果你解決您的設計,使你不需要靜態字段,或者每個後代至少沒有,但這裏有雲:

class Base<TDescendant> 
    where TDescendant : Base 
{ 
    public static int x; 
    public int myMethod() 
    { 
      x += 5; 
      return x; 
    } 

} 

class DerivedA : Base<DerivedA> 
{ 
} 

class DerivedB : Base<DerivedB> 
{ 
} 

這依賴於這樣一個事實:通用使用靜態字段的類型將爲您調用的每個類型獲取這些靜態字段的單獨副本。

但是,如果你打算從DerivedA或DerivedB下降,它會變得棘手,所以我不建議沿着這條線走下去。

+0

我選擇實現這種模式,我認爲這是一種合法模式。我歡迎反饋。我的靜態屬性是一個包含令牌替換映射的靜態列表。每個電子郵件類型都有自己的類,它從基類繼承。這些類用於處理電子郵件 - 電子郵件模板中有令牌,在運行時用實際值替換。令牌不會改變,所以我使用靜態屬性:private static Dictionary _TokenReplacementMappings = new Dictionary (){...}; –

+0

我也喜歡這種方法。 –

+0

但是對於多層次的繼承,需要與這樣的技術和上面的技術混合搭配。 –

0

我通常實現的子類具體的東西作爲一個抽象的獲取屬性

public class Base 
{ 
    // You must pick one option below 

    // if you have a default value in the base class 
    public virtual int x { get { return 7; /* magic default value */} } 

    // if you don't have a default value 
    // if you choose this alternative you must also make the Base class abstract 
    public abstract int x { get; } 
} 

public class DerivedA : Base 
{ 
    public override int x { get { return 5; } } 
} 

public class DerivedB : Base 
{ 
    public override int x { get { return 10; } } 
} 
+1

關鍵(這裏是缺少的)是該屬性是'靜態'。 – neizan

1

與類型靜態字典作爲鍵應該做的。我的意思是避免邏輯重複和每個派生類型的不同值,但在實例之間共享。

public class Base 
{ 
    private static Dictionatry<Type,int> _values; 

    public int MyMethod() 
    { 
     _values[this.GetType()]+=5; 
     return _values[this.GetType()]; 
    } 
} 
相關問題