【问题标题】:C# How to Call static method from subclassC#如何从子类调用静态方法
【发布时间】:2015-09-29 13:43:09
【问题描述】:

我有这个代码:

class Super{ 
   public static List<Super> methodA() { . . . }
}
class Sub:Super{ 
   public static List<Sub> methodA() { . . . }
}

然后我打电话:

 Sub.methodA();

但被执行者来自超类。无论如何我可以执行子类的静态方法吗?它们具有相同的静态方法名称

更新: 您可以看到 Product 是我的超类,而 purchase 是子类。两者都有相同的静态 getAll() 但返回不同的类型。在这种情况下,它返回列表

【问题讨论】:

  • 其实Sub.methodA()会从子类中执行静态方法
  • 试过了,但不是从子类的方法调用,而是调用超类的方法。
  • @user2936719 您的示例与您的真实代码无关,或者您遗漏了一些东西。但实际上 - Sub.methodA() 在您显示的代码中将调用 sub 方法,而不是 super 方法。
  • @user2936719,那么你做错了,因为Sub.methodA() 只能在Sub 中调用methodA
  • 你肯定做错了什么。调用应该执行Sub.methodA() 而不是Super.methodA() 如果你想确保你通过Sub 的实现创建一个新方法,在你的静态方法中添加一个new 关键字

标签: c# class static


【解决方案1】:

在子类中使用与超类提供的相同方法名称,您必须重写它 - 但是对于 C# 中的静态方法是不可能的。

请看一下这篇文章,它为该主题提供了很好的内幕:

【讨论】:

    【解决方案2】:

    子类中的methodA 将隐藏基类中的方法。所以Sub.methodA 将调用 sub 类中的方法,而不是基类。

    Sub.MethodA()' 隐藏继承的成员 'Super.MethodA()'。如果要隐藏,请使用 new 关键字。

    【讨论】:

      【解决方案3】:

      按预期工作,请参阅以下示例 (runnable)。您的示例代码和真实代码之间出现了问题。

      public class Program
      {
          public static void Main()
          {
              Console.WriteLine(Sub.methodA());
              Console.WriteLine(Super.methodA());
          }
      }
      class Super{ 
         public static List<Super> methodA() { return new List<Super>(); }
      }
      class Sub:Super{ 
         public new static List<Sub> methodA() { return new List<Sub>(); }
      }
      

      【讨论】:

        【解决方案4】:

        这称为“隐藏”而不是“覆盖”。虽然不推荐,但确实有效。如果调用 Super.MethodA,它会在基类上运行该方法。如果您运行 Sub.MethodA,它将运行派生类中的方法。我刚刚证实这是 100% 确定的。

        您可能想在这里重新考虑您的设计。如果这个想法只是让某人获得您的对象列表而不必每次都新建一个类,那么有很多不同的方法可以做到这一点,不需要隐藏。一些实现细节可能有助于我们提出有效的方法。

        【讨论】:

          【解决方案5】:

          只需使用类型名称来调用它们:

           Sub.methodA();
           Super.methodA();
          

          静态方法只存在于声明它的类。它不能被继承,也不能在类的实例上调用。

          class Super
          {
              public static char methodA() 
              {
                  return 'a'; 
              }
          }
          class Sub : Super
          {
              public static char methodA() 
              {
                  return 'b'; 
              }
          }
          
          class Program
          {
              static void Main(string[] args)
              {
                  var res = Sub.methodA();
                  var res2 = Super.methodA();
          
                  Console.WriteLine(res == res2);
          
                  Console.ReadKey();
          }
          

          输出:false

          【讨论】:

            【解决方案6】:

            Super.methodA(); 将从任何地方调用超类的静态方法……从超类、从子类、从两个类外部等等

            Sub.methodA(); 将在任何地方调用 sub 的静态方法...

            这是我的测试代码:

            class Program
            {
                class Super
                {
                    public static List<Super> methodA() { Console.WriteLine("SUPER"); return new List<Super>(); }
            
                    public void callSuper()
                    {
                        Super.methodA();
                    }
            
                    public void callSub()
                    {
                        Sub.methodA();
                    }
                }
                class Sub : Super
                {
                    public static List<Sub> methodA() { Console.WriteLine("SUB"); return new List<Sub>(); }
            
                    public void callSuper()
                    {
                        Super.methodA();
                    }
            
                    public void callSub()
                    {
                        Sub.methodA();
                    }
                }
            
                static void Main(string[] args)
                {
                    Super.methodA();
            
                    Sub.methodA();
            
                    var s = new Sub();
                    s.callSuper();
                    s.callSub();
            
                    var Sup = new Super();
                    Sup.callSuper();
                    Sup.callSub();
            
                    Console.ReadLine();
                }
            }
            

            【讨论】:

            • 通过将您的编辑与您的原始问题进行比较,我的印象是,当您将测试示例放在一起时丢失了一些东西,并且我们没有全面了解您的问题。当我的测试代码(上面)编译时没有错误或警告时,我感到很震惊......所以这告诉我你的问题与 Super 与 Sub 无关。如果您仍然遇到问题,我建议您将方法重命名为 GetAllProducts 和 GetAllPurchases。
            • 如果您要重命名这些方法,即使只是暂时的,也可能更容易找到您的问题。通过查看您的编辑,我怀疑您的某个声明可能不正确,但我不确定,因为我们没有全貌。
            • 嘿user2936719,选择我的答案...我需要积分!!开个玩笑(还是我?)。这个问题的最终结果是什么?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-11-23
            • 2010-10-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-06
            相关资源
            最近更新 更多