首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从基更改成员派生的静态类

从基更改成员派生的静态类
EN

Stack Overflow用户
提问于 2019-07-10 19:51:15
回答 4查看 109关注 0票数 2

在C#中,静态类不能从object以外的任何其他类派生。目前我有这个基类:

代码语言:javascript
运行
复制
public static class BaseModule
{
    public static string UsedSource {get; set;}

    public static Write(string text)
    {
        OtherStaticClass.Log(UsedSource, text);
    }
}

现在,根据我使用的类,我想要更改UsedSource

代码语言:javascript
运行
复制
// 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
    }
}

应该是这样调用的

代码语言:javascript
运行
复制
ModuleA.Write("Hi");
ModuleB.Write("Hi");

这种方法不起作用,因为静态类不能从object以外的任何对象派生。是否有其他方法可以更改该属性?

EN

Stack Overflow用户

发布于 2019-07-10 20:14:44

使用静态类意味着使用单例。单例违背了跟踪类的有效依赖关系的目的。

无论如何,你可以通过重构你的代码和使用工厂来解决这个问题:

在这种情况下,只需删除static关键字并让类可继承(您必须添加适当的virtual关键字以允许正确继承):

代码语言:javascript
运行
复制
public class BaseModule
{
    public string UsedSource {get; set;}

    public Write(string text)
    {
        OtherStaticClass.Log(UsedSource, text);
    }
}

然后,添加一个包含引用的额外类(我给出了无用的名称,重点放在用途上):

代码语言:javascript
运行
复制
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类(可以继承)作为方法/构造函数的参数传递。

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56970150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档