![](/img/trans.png)
[英]How can I extend a LINQ-to-SQL class without having to make changes every time the code is generated?
[英]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.