【问题标题】:alternative to base keyword in static method of derived class to call overrided method of base class替代派生类的静态方法中的base关键字来调用基类的重写方法
【发布时间】:2013-07-30 05:11:44
【问题描述】:

我有以下代码

    class A{
            public void display()
            {
                    Console.WriteLine("In class A");
            }
    }
    class B:A{
            public void display()
            {
                    Console.WriteLine("In class B");
            }
            public static void show()
            {
                    //base.display(); gives error
            }
    }

在上面的代码中 base.display();给出错误。我必须在方法 show() 中调用基类方法 display() 而不创建类 A 的对象。我该怎么做?或者我不能这样做?

【问题讨论】:

  • 你试过new A().display()吗?
  • 为什么不直接从 B show() 中删除静态密钥?
  • @simon thanx,它使用 new A().display() 工作,但是任何其他方式不使用 new A().display 并访问覆盖方法的非静态方法派生类的静态方法中的基类。B 类的扩展方法中触发了我的问题。
  • 从技术上讲,您并没有覆盖 B 类中的显示方法,您只是声明了一个具有相同名称的新方法。我敢打赌你的编译器会给你一个警告。

标签: c# base


【解决方案1】:

static 方法不属于实例,因此它没有base。如果A.display() 也是static 方法,您只能说A.display()。你也可以说new A().display()在调用display()之后丢弃实例。

【讨论】:

  • 如果 A.display() 是非静态的,那么它可以使用 new A().display() 工作,但如果 A.display 是静态的,那么它就不起作用。但是我关于任何替代方案的问题静态方法中的 base 关键字
  • 如果 A.display() 是静态的,那么您只需使用 A.display() 调用它。不需要新的。由于静态的东西不支持继承,因此在静态中没有等效的基础。在静态方法中,您必须直接引用父类 A 的名称。
  • 如果static不支持继承,所以我们不能在静态方法中调用基类成员,所以在静态方法中base没有关键字替代,okthanx。
【解决方案2】:

您不能在静态方法中使用实例数据。

静态方法应该是自包含的。这就是说它将 无需或保存任何有状态数据即可执行其功能。

 class A{
            public static void display()
            {
                    Console.WriteLine("In class A");
            }
    }
      class B : A
      {
          public void display()
          {
              Console.WriteLine("In class B");
          }
          public static void show()
          {
              A.display(); 
          }
      }

【讨论】:

    【解决方案3】:

    您收到错误是因为您从不允许的静态方法调用实例方法。

    这里有 3 个选项。你可以选择任何适合你的。

    选项 1。

    class A{
            public void display()
            {
                    Console.WriteLine("In class A");
            }
    }
    class B:A{
            public void display()
            {
                    Console.WriteLine("In class B");
            }
            public void show()
            {
                    base.display();
            }
    }
    

    选项 2:

    class A{
                public static void display()
                {
                        Console.WriteLine("In class A");
                }
        }
        class B:A{
                public void display()
                {
                        Console.WriteLine("In class B");
                }
                public void show()
                {
                        A.display();
                }
        }
    

    选项 3:

    class A{
                public void display()
                {
                        Console.WriteLine("In class A");
                }
        }
        class B:A{
                public void display()
                {
                        Console.WriteLine("In class B");
                }
                public void show()
                {
                        new A().display();
                }
        }
    

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2012-05-24
      • 2012-06-25
      • 2010-10-10
      • 2023-03-12
      • 1970-01-01
      • 2013-04-24
      • 2014-07-31
      相关资源
      最近更新 更多