【问题标题】:How to use variables of child in parents static method?如何在父母静态方法中使用孩子的变量?
【发布时间】:2015-11-12 17:42:58
【问题描述】:

我试图弄清楚是否有可能我如何强制子类在从父类派生的静态方法中使用他们自己的变量。

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

有什么办法吗?

【问题讨论】:

  • 如果您使用属性而不是字段并且它不是static,您可以在基类中使用virtual关键字,然后在继承类中使用override,或者可能是 new 关键字。
  • @BrettCaswell new 如何帮助改变基类的行为???
  • @AlexeiLevenkov,OP 没有说他想改变基类的行为。他为什么要这样做? ....他希望孩子拥有自己的变量和与“父”对象同名的方法,
  • @BrettCaswell “在从父级派生的静态方法中” - 虽然此语句使用“派生”,但我认为 OP 的意思不是“自己的方法”而是“继承的方法”。现在我明白了如何将其解释为“如何让孩子使用自己的方法”,但我最初阅读这篇文章时并没有看到这种可能性。

标签: c# static static-methods static-members


【解决方案1】:

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

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.myString
  • 这样Parent中的静态方法就可以取到了。
  • 一般情况下,您只需转换为((Parent)Child).MyMethod((Parent)Child).myString) 类型即可
  • @BrettCaswell 这是static,所以这些规则不适用。 Parent.MyMethod() 始终指代Parent.myStringChild.myString 是一个完全不同的变量。除非您更改 Parent.myString,否则您不会看到任何不同。
  • opps..不,我不正确...他说使用派生静态方法..嗯
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      static 修饰符不适用于子类。指定静态方法或字段的完整方法是使用类名。在您的示例中,您在两种情况下访问的字段都是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();
      

      你会看到新的字符串。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-08
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        • 2016-09-18
        • 1970-01-01
        相关资源
        最近更新 更多