2014-10-05 39 views
0

我試圖創造,我可以在我的程序在所有課程中訪問,並就好像他們在每個類,即相同的情況下存在使用它們時不必鍵入「gVariables.」一些全局變量如何擴展一個表單類來訪問全局變量而不必指定它屬於哪個類?

class gVariables 
{ 
    public static string VariableA; 
    public static int VariableB; 
    public static byte[] VaraibleC; 
    public static bool AppIsClosing = false; 
} 

這工作在標準的類:

public class SomeClass : gVariables 
{ 
    private void SomeMethod() 
    { 
     //Dont need to type 'gVariables.' 
     VariableA = "FooBar"; 
     VariableB = 1024; 
    } 
} 

但我怎麼能做到這一點在繼承System.Windows.Forms.Form一類?

+3

答案是:不要那樣做,真的。你爲什麼要:1)有一個全局狀態,隱藏耦合並禁止可測試性2)隱藏這些變量所在的事實,從而有效地降低代碼的可讀性? – BartoszKP 2014-10-05 13:07:56

+1

在複雜的應用程序中,通常不可避免地需要某種全局變量來表示應用程序的全局上下文。 (請注意,我談論的變量在類或表單上下文中沒有意義,但在應用程序上下文中更具全局性)只需爲您的類使用一個有意義的名稱(如MyBusinessApp或類似的名稱)並使用它。這將很容易記住,你或你未來的同事會覺得很容易處理。當然,如果你可以首先避免這些全局變量..... – Steve 2014-10-05 13:13:55

+0

你能解釋一下,爲什麼你不能使用全局變量作爲'gVariables.VariableA'? – Fabio 2014-10-06 04:07:36

回答

1

您可以創建一個從窗體繼承的BaseForm。然後在每個表單中(例如DerivedForm),您可以從BaseForm繼承。例如:

public class BaseForm : Form 
{ 
    public static string VariableA; 
    public static int VariableB; 
    public static byte[] VaraibleC; 
    public static bool AppIsClosing = false; 

} 

public class DerivedForm : BaseForm 
{ 

} 
+0

但我會有不是表單的類,所以我不想讓它們繼承'Form'。 – 2014-10-05 13:08:00

+1

你不能吃你的蛋糕,也不能吃。說真的,從上面的評論中聽取建議,不要這樣做 – Steve 2014-10-05 13:09:59

0

一種方法是將基類全部作爲成員,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 
} 

假設你大量使用全局變量,現在你可以指向到全局變量只是AppIsClosingSomeClass任何地方。


您的需求使用全局變量(我相信)不是global variables一些evil use。當您將int temp設爲全局變量(或任何其他應該是本地的變量)時,全局變量很糟糕。

我用我的方法看到的問題是,您永遠無法知道何時訪問了GlobalVariables的成員。例如,如果我們試圖找到GlobalVariables.AppIsClosing的引用,Visual Studio會向我們展示一些IGlobalVariables.AppIsClosing實現,這是完全無用的。

只需使用您的全球課程。不得不輸入幾個字符是造成這種尷尬設計的最糟糕的原因之一。

我向您展示這種模式,因爲我們必須移植使用具有多重繼承的遺留語言編寫的軟件框架。這就是我們所做的。我們通過接口和對象聚合來模擬多重繼承。我認爲我們有很好的理由使用這種尷尬的設計模式。

相關問題