一種方法是將基類全部作爲成員,as Donal has shown you。但正如你在評論中所說的那樣,你不能爲所有的類設置一個通用的基類。
我會告訴你一個方法,你可以做到這一點,但我不建議你應該做到這一點。我要告訴你的是一種到simulate multiple inheritance in C#的方法(同樣,如果你沒有很好的理由,不推薦),所以你可以繼承你的全局變量類和自然父類。
您可以使用一個接口,並讓所有類實現該接口。爲了縮短實例,我將只選擇一個變量:AppIsClosing
。
interface IGlobalVariables
{
public bool AppIsClosing { get; set; }
}
你應該讓你的類包含全局變量,它實現了IGlobalVariables
。爲了確保只有一個實例存在,我們還將實現單例模式。
class GlobalVariables : IGlobalVariables
{
private bool _appIsClosing = false;
private static GlobalVariables _instance = new GlobalVariables();
private GlobalVariables() {}
public static Instance {
get { return _instance }
}
public bool IGlobalVariables.AppIsClosing
{
get { return this._appIsClosing; }
set { this._appIsClosing = value; }
}
}
然後在所有其他類,你可以這樣做:
class SomeClass : WhateverYouWantTheParentClassToBe, IGlobalVariables
{
public bool IGlobalVariables.AppIsClosing
{
get { return GlobalVariables.AppIsClosing; }
set { GlobalVariables.AppIsClosing = value; }
}
// other code
}
假設你大量使用全局變量,現在你可以指向到全局變量只是AppIsClosing
在SomeClass
任何地方。
您的需求使用全局變量(我相信)不是global variables一些evil use。當您將int temp
設爲全局變量(或任何其他應該是本地的變量)時,全局變量很糟糕。
我用我的方法看到的問題是,您永遠無法知道何時訪問了GlobalVariables
的成員。例如,如果我們試圖找到GlobalVariables.AppIsClosing
的引用,Visual Studio會向我們展示一些IGlobalVariables.AppIsClosing
實現,這是完全無用的。
只需使用您的全球課程。不得不輸入幾個字符是造成這種尷尬設計的最糟糕的原因之一。
我向您展示這種模式,因爲我們必須移植使用具有多重繼承的遺留語言編寫的軟件框架。這就是我們所做的。我們通過接口和對象聚合來模擬多重繼承。我認爲我們有很好的理由使用這種尷尬的設計模式。
答案是:不要那樣做,真的。你爲什麼要:1)有一個全局狀態,隱藏耦合並禁止可測試性2)隱藏這些變量所在的事實,從而有效地降低代碼的可讀性? – BartoszKP 2014-10-05 13:07:56
在複雜的應用程序中,通常不可避免地需要某種全局變量來表示應用程序的全局上下文。 (請注意,我談論的變量在類或表單上下文中沒有意義,但在應用程序上下文中更具全局性)只需爲您的類使用一個有意義的名稱(如MyBusinessApp或類似的名稱)並使用它。這將很容易記住,你或你未來的同事會覺得很容易處理。當然,如果你可以首先避免這些全局變量..... – Steve 2014-10-05 13:13:55
你能解釋一下,爲什麼你不能使用全局變量作爲'gVariables.VariableA'? – Fabio 2014-10-06 04:07:36