如何在parents静态方法中使用child的变量?

How to use variables of child in parents static method?

我想弄清楚是否有可能我如何强制 child class 在派生自 parent 的静态方法中使用它们自己的变量。

class Parent
{

    public static string myString = "I don't want this string";

    public static void MyMethod()
    {

        Console.Write(myString);
    }
}

class Child : Parent
{

    public static string myString = "I want THIS string";
}

class Program
{

    static void Main()
    {

        Child.MyMethod(); // I want to output "I want THIS string";
    }
}

有什么办法吗?

是的,有一个解决方法。使用单例模式并使这些字段虚拟化。

改用实例方法。静态成员(方法、字段)有它们的位置,但通常不能很好地融入 OOP 设计原则。

此外,我认为您的继承层次结构没有多大意义。

查看有关多态性的 MSDN 指南,这是了解这些基础知识的良好开端:

https://msdn.microsoft.com/en-us/library/ms173152.aspx

任何方式?当然可以,但我永远不会这样做。重新考虑您的设计。这是一个非常糟糕的技巧:

class Parent{
    public static string myString = "I don't want this string";

    public static void MyMethod(){
        Console.Write(myString);
    }
}

class Child : Parent{
    new public static string  myString = "I want THIS string";
    public new static void MyMethod(){
        var old=Parent.myString;
        Parent.myString=myString;
        Parent.MyMethod();
        Parent.myString=old;
    }
}

class Program
{
    static void Main()
    {
        Child.MyMethod(); // I want to output "I want THIS string";
    }
}

如果您因为 MyMethod 中的代码太复杂而不想重复它而尝试这样做,那么这样做几乎可以保证您会破坏一些非常糟糕的东西,因为它会改变值myString 在 Parent 中,而 child 正在做这件事。很差。

static修饰符不适用于子classes。指定静态方法或字段的完整方法是使用 class 名称。在您的示例中,您在两种情况下访问的字段都是 Parent.mystring.

将标记为 static 的任何内容视为全局变量或函数。

做你想做的唯一方法是使用实​​例方法和字段:

class Parent
{
    protected string myString = "I don't want this one";

    public void MyMethod()
    {
        Console.Write(myString);
    }
}

class Child : Parent
{
    public Child()
    {
        myString = "I want this one";
    }
}

如果你这样做的话:

Parent variable = new Parent();
variable.MyMethod();

您将看到原始字符串,但如果您这样做:

Parent variable = new Child();
variable.MyMethod();

您将看到新字符串。

另请理解,如果您更改静态字段的值,则无论您如何访问它,整个应用程序都会发生更改。您不能让某些情况下使用一个字符串而其他情况下使用另一个。这就是实例值的用途。