2011-09-22 33 views
0

由於C#沒有爲接口提供靜態成員支持很難保證類中存在某些靜態成員。我知道它有一個抽象的類 - 祖先,但我不能使用它,因爲在這種情況下,靜態成員將是相同的。例如:如何保證類型中存在靜態成員?

class StaticClass 
{ 
    protected static int _secretNumber = 10; 

    public static int SecretNumber { get { return StaticClass._secretNumber; } } 
} 

class SomeData : StaticClass 
{ 
    SomeData() { SomeData._secretNumber = 25; } 
} 

class SomeData2 : StaticClass 
{ 
    SomeData2() { SomeData2._secretNumber = 50; } 
} 

在這種情況下StaticClass.SecretNumber = SomeData.SecretNumber = SomeData2.SecretNumber = 10 我必須爲了保證一個類型包含自己的靜態成員呢?

+0

爲什麼你需要保證?此外,如果您正在對接口進行編程,您將無法訪問此靜態成員。你的目標是什麼? – Jon

+0

我的理由非常明顯:接口不支持靜態成員,但我只需要通過接口或抽象類並使用它們的靜態成員來處理不同的類型。 – Vasya

+0

嗯......你不是說你自己,接口不支持靜態成員,基類會共享成員=>你需要做你已經知道不可能的東西嗎? – Jon

回答

0

簡答題 - 你不行。你爲什麼想要?要訪問這些字段,你必須直接引用它們(除非你使用了反射),所以編譯器會檢查你。

你爲什麼要這樣做?

如果您只是希望子類分配變量,那麼這就是您無法在代碼中指定的類的契約。使用文檔來解釋,子類必須爲此變量分配一個特定的數字。

0

首先,「受保護的靜態」是未被約束的,所以我會避免它。

其次,爲什麼不定義「secretNumber」作爲實例,而不是靜態的?

我沒有看到任何有「靜態接口」的有效理由,除非你會玩反射。

0

免責聲明:我知道你在提議具有非常明顯的氣味

因爲他是一個通用的解決問題的一部分,演習的緣故。是可以做你想要的一部分。完成某些我認爲充其量只是設計錯誤的事情是有點詭計的。但作爲代碼練習,這種代碼編寫起來很有趣。

下面的代碼不需要Derived來初始化靜態字段,但可以確保任何派生類都具有它自己的實例。但是在使用靜態成員時,您仍然需要通過具體的類來訪問它。所以我看不出它是如何有用

class BaseClass<T, K> where T : BaseClass<T, K> 
{ 
    protected static K _secret; 

    public static K Secret { get { return _secret; } } 
} 

class Derived : BaseClass<Derived, int> 
{ 
    static Derived() 
    { 
     _secret = 10; 
    } 
} 
+0

但是,所有派生類都將共享「靜態」成員。 – Jon

+0

@jon並不是真正的,因爲每個派生類都是通過它來自我實例化基於類的類,他們獲得了自己的靜態實例。 –