在C#中,静态类不能从object以外的任何其他类派生。目前我有这个基类:
public static class BaseModule
{
public static string UsedSource {get; set;}
public static Write(string text)
{
OtherStaticClass.Log(UsedSource, text);
}
}现在,根据我使用的类,我想要更改UsedSource。
// this does not work
internal static class ModuleA : BaseModule
{
static ModuleA(){
UsedSource = "A" // just an example
}
}
// this does not work
internal static class ModuleB : BaseModule
{
static ModuleB(){
UsedSource = "B" // just an example
}
}应该是这样调用的
ModuleA.Write("Hi");
ModuleB.Write("Hi");这种方法不起作用,因为静态类不能从object以外的任何对象派生。是否有其他方法可以更改该属性?
发布于 2019-07-10 20:06:27
这里有很多静态类,我不完全确定它们是否有必要。我的示例不使用静态类,除了用于您已有的OtherStaticClass引用。我知道这可能不是你想要的;有很多方法可以剥这只猫的皮。
public abstract class BaseModule
{
public string UsedSource { get; set; }
public void Write(string text)
{
OtherStaticClass.Log(UsedSource, text);
}
}
public class ModuleA : BaseModule
{
public ModuleA()
{
UsedSource = "A";
}
}
public class ModuleB : BaseModule
{
public ModuleB()
{
UsedSource = "B";
}
}要获得您的输出,您只需要创建ModuleA和ModuleB的新实例。
var moduleA = new ModuleA();
var moduleB = new ModuleB();
moduleA.Write("Hi");
moduleB.Write("Hi");发布于 2019-07-10 20:14:44
使用静态类意味着使用单例。单例违背了跟踪类的有效依赖关系的目的。
无论如何,你可以通过重构你的代码和使用工厂来解决这个问题:
在这种情况下,只需删除static关键字并让类可继承(您必须添加适当的virtual关键字以允许正确继承):
public class BaseModule
{
public string UsedSource {get; set;}
public Write(string text)
{
OtherStaticClass.Log(UsedSource, text);
}
}然后,添加一个包含引用的额外类(我给出了无用的名称,重点放在用途上):
public static class MySingleton
{
public static BaseModule _Module;
public static BaseModule Module
{
get
{
return _Module;
}
}
public static void ChangeImplementation (BaseModule module)
{
// do your checks here
_Module = module;
}
}这样你就能达到你的要求了。
正如您所看到的,这段代码有几个问题,其中很重要的一点是,这段代码具有全局副作用,并且不是线程安全的。
一种更好的方法是完全删除单例,并在需要时将BaseModule类(可以继承)作为方法/构造函数的参数传递。
发布于 2019-07-10 20:23:52
我不认为你需要一个以上的静态类。相反,将逻辑分离到一个静态类中的方法中。
public static class Module
{
private const string SourceA = "A";
private const string SourceB = "B";
public static WriteA(string text)
{
Write(SourceA, text);
}
public static WriteB(string text)
{
Write(SourceB, text);
}
private static Write(string source, string text)
{
OtherStaticClass.Log(source, text);
}
}然后,不是
ModuleA.Write("Hi");
ModuleB.Write("Hi");你会做的
Module.WriteA("Hi");
Module.WriteB("Hi");https://stackoverflow.com/questions/56970150
复制相似问题