静态类源自基本更改成员

时间:2019-07-10 11:51:15

标签: c# inheritance static overriding

在C#中,除了对象之外,静态类不能从任何其他类派生。 目前,我有这个基类:

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");

此方法不起作用,因为静态类不能从对象以外的任何对象派生。 还有其他更改属性的方法吗?

4 个答案:

答案 0 :(得分:1)

您这里有很多静态类,但我不确定它们是否是必需的。我的示例除了使用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";
    }
}

然后,要获取输出,只需创建ModuleAModuleB的新实例。

var moduleA = new ModuleA();
var moduleB = new ModuleB();
moduleA.Write("Hi");
moduleB.Write("Hi");

答案 1 :(得分:1)

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

无论如何,您可以通过重构代码并使用工厂来解决该问题:

在这种情况下,只需删除from selenium.webdriver.common.keys import Keys driver.find_element_by_tag_name('body').send_keys(Keys.PAGE_DOWN) 关键字并使该类可继承(您必须添加适当的String str="रिश्ते भले ही कम ही बनाओ लेकिन दिल से निभाओ,\n" + "क्योंकि आज कल इंसान अच्छाई के चक्कर में अच्छे खो देते है।"; //textview.setText(str); textview.setText(Html.fromHtml(String.format(colorfulltext(str))), TextView.BufferType.SPANNABLE); // highlight text public String colorfulltext(String text) { String[] colors = new String[]{"#fdc113", "#fdc113", "#fdc113","#fdc113", "#fdc113" ,"#fcfcfc", "#fcfcfc", "#fcfcfc", "#fcfcfc", "#fcfcfc", "#fcfcfc", "#fcfcfc", "#fcfcfc", "#fcfcfc","#fcfcfc","#fcfcfc","#fcfcfc","#fcfcfc"}; StringBuilder finals = new StringBuilder(); int size = colors.length; int k = 0; for (int item = 0; item < text.length(); item++) { if (k >= size) { k = 0; } finals.append("<font color='" + colors[k] + "'>" + text.charAt(item) + "</font>"); k++; } return finals.toString(); } 关键字以允许适当的继承):

static

然后,添加一个包含引用的附加类(我给出了无用的名称,着眼于目的):

virtual

这样,您就可以实现您的要求。

如您所见,该代码存在多个问题,其中重要的一点是,该代码具有全局副作用,而且不是线程安全

更好的方法是完全删除单例,并在需要时将public class BaseModule { public string UsedSource {get; set;} public Write(string text) { OtherStaticClass.Log(UsedSource, text); } } 类(可以继承)作为方法/构造函数的参数传递。

答案 2 :(得分:1)

我看不到您需要多个静态类。而是将逻辑分为一个静态类中的方法。

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");

答案 3 :(得分:0)

如果您无法更改 BaseModule 类,则可以将其与其他状态一起使用,并在使用后恢复状态:

public static class BaseModule
{
    public static string UsedSource {get; set;}

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

internal class Writer : IDisposable
{
    string _lastSource;

    public Writer(string source)
    {
        _lastSource = BaseModule.UsedSource;
        BaseModule.UsedSource = source;
    }

    public void Dispose()
    {
        BaseModule.UsedSource = _lastSource;
    }
}

internal abstract class Module
{
    public abstract Source { get; };

    public void Write(string text)
    {
        using (var writer = new Writer(Source))
        {
            BaseModule.Write(text);
        }
    }   
}   

internal class ModuleA : Module
{   
    public override Source => "A";
}

internal class ModuleB : Module
{   
    public override Source => "B";
}

但是您必须确保线程安全。

如果您可以更改 BaseModule 类:

public static class BaseModule
{    
    public static Write(string text, string source)
    {
        OtherStaticClass.Log(source, text);
    }
}

internal abstract class Module
{
    public abstract Source { get; };

    public void Write(string text)
    {       
        BaseModule.Write(text, Source);     
    }   
}   

internal class ModuleA : Module
{   
    public override Source => "A";
}

internal class ModuleB : Module
{   
    public override Source => "B";
}