使一个超类有一个静态变量,它对于c#中的每个子类都是不同的

ste*_*ste 7 c# inheritance static-variables

在子类中没有任何代码的情况下,我希望抽象类为每个子类提供不同的静态变量副本.在C#中

abstract class ClassA
{
    static string theValue;

    // just to demonstrate
    public string GetValue()
    {
        return theValue;
    }
    ...
}
class ClassB : ClassA { }
class ClassC : ClassA { }
Run Code Online (Sandbox Code Playgroud)

和(例如):

(new ClassB()).GetValue(); // returns "Banana"
(new ClassC()).GetValue(); // returns "Coconut"
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是:

abstract class ClassA
{
    static Dictionary<Type, string> theValue;
    public string GetValue()
    {
        return theValue[this.GetType()];
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

虽然这很好用,但我想知道是否有更优雅或内置的方式来做到这一点?

这类似于我可以为每个不同类型的继承类拥有静态变量的不同副本,但我无法控制子类

Jim*_*lor 12

还有一种更优雅的方式。您可以利用这样一个事实:对于不同类型的每个派生类,泛型基类中的静态变量是不同的

public abstract class BaseClass<T> where T : class
{
    public static int x = 6;
    public int MyProperty { get => x; set => x = value; }
}
Run Code Online (Sandbox Code Playgroud)

对于每个子类,静态 int x 对于每个唯一的 T 来说都是唯一的 让我们派生出两个子类,我们使用子类的名称作为基类中的泛型 T。

public class ChildA: BaseClass<ChildA>
{
}

public class ChildB : BaseClass<ChildB>
{
}
Run Code Online (Sandbox Code Playgroud)

现在静态 MyProperty 对 ChildA 和 ChildB 都是唯一的

var TA = new ChildA();
TA.MyProperty = 8;
var TB = new ChildB();
TB.MyProperty = 4;
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 6

虽然这很好用,但我想知道是否有更优雅或内置的方式来做到这一点?

实际上没有内置的方法,因为你在这里违反了基本的OO原则.您的基类应该不了解传统面向对象理论中的子类.

话虽这么说,如果你必须这样做,你的实现可能与你将要获得的一样好,除非你可以直接向子类添加一些其他信息.如果你需要控制它,并且你不能改变子类,这可能是你最好的方法.