在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");
此方法不起作用,因为静态类不能从对象以外的任何对象派生。 还有其他更改属性的方法吗?
答案 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";
}
}
然后,要获取输出,只需创建ModuleA
和ModuleB
的新实例。
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";
}