繁体   English   中英

如何扩展表单类以访问全局变量,而不必指定它属于哪个类?

[英]How can I extend a form class to access global variables without having to specify which class it belongs to?

我正在尝试创建一些全局变量,可以在程序中的所有类之间进行访问,并像在每个类的相同上下文中使用它们一样使用它们,即无需键入' 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的类中执行此操作?

您可以创建从Form继承的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
{

}

一种方法是创建一个包含所有全局变量作为成员的基类, 如Donal所示 但是,正如您在评论中所说,您不可能为所有类都拥有一个通用的基类。

我会告诉你一个方法,你可以这样做,但我不建议你应该这样做。 我要告诉您的是一种在C#中模拟多重继承的方法(同样,如果您没有充分的理由,不建议这样做),这样您就可以继承全局变量类和自然父类。

您可以使用一个接口,并使所有类都实现该接口。 为了AppIsClosing示例,我将只选择一个变量: 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
}

假设您大量使用全局变量,现在可以将全局变量引用为SomeClass任何地方的AppIsClosing


您对使用全局变量的要求(我认为)不是对全局变量的某种邪恶使用 当您将int temp设为全局变量(或应为局部的任何其他变量)时,全局变量很糟糕。

我看到的方法问题是,您永远无法确定何时访问GlobalVariables成员。 例如,如果我们尝试找到GlobalVariables.AppIsClosing引用,Visual Studio将向我们展示一堆IGlobalVariables.AppIsClosing实现,这是完全没有用的。

只需使用您的全局类。 不得不键入少量字符是进行这种笨拙设计的最糟糕原因之一。

我向您展示了这种模式,因为我们必须移植使用具有多重继承的传统语言编写的软件框架。 这就是我们所做的。 我们通过接口和对象聚合来模拟多重继承。 我认为我们有充分的理由使用这种笨拙的设计模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM