我能否调用覆盖方法的基类方法?

3

除了使用重构之外,是否可以从B类的实例中调用A.F()方法?谢谢。


  class Program
  {
    public class A
    {
      public virtual void F()
      {
        Console.WriteLine( "A" );
      }
    }
    public class B : A
    {
      public override void F()
      {
        Console.WriteLine( "B" );
      }
    }

    static void Main( string[] args )
    {
      B b = new B();  

      //Here I need Invoke Method A.F() , but not overrode..      

      Console.ReadKey();
    }
  }
5个回答

6

您可以使用 new 关键字来定义另一个同名方法的定义。根据引用类型,您将调用 AB 的实现。

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

static void Main( string[] args )
{
  B b = new B();  

  // write "B"
  b.F();

  // write "A"
  A a = b;
  a.F();
}

如果你觉得new不是正确的解决方案,你应该考虑写两个带有特殊名称的方法。


通常情况下,如果一个方法被正确地重写了,你就不能从类外部调用基本实现。这是一个面向对象的概念。你必须要有另一个方法。有四种方法(我能想到的)来指定这个特殊的方法:

  • 写一个带有另一个名称的方法。
  • 写一个带有相同名称但不同签名(参数)的方法。这被称为重载。
  • 使用相同名称编写方法的新定义(使用new关键字)。这被称为隐藏。
  • 将其放在接口上,并至少显式实现一个接口。(类似于new,但基于接口)

3

你需要使用base.F();


1

你只能在类定义内部调用基本方法。因此,如果你需要这样做,你必须在那里这样做。这可能意味着你必须重载该方法以从外部源调用基本方法(类似于@Edward Leno所提到的方式)。

class Program 
  { 
    public class A 
    { 
      public virtual void F(bool useBase) 
      { 
        Console.WriteLine( "A" ); 
      } 
    } 
    public class B : A 
    { 
      public override void F(bool useBase) 
      { 
        if(useBase) base.F();
        else Console.WriteLine( "B" ); 
      } 
    } 


    static void Main( string[] args ) 
    { 
        B b = new B();   

        //Here I need Invoke Method A.F() , but not overrode..       
        b.F(true);

        Console.ReadKey(); 
        } 
    }
  }

1

在派生类中,您可以使用base.method()来调用基类中的方法。


是的,我知道这个... 但是我想从Main函数执行A.F(),而不是从派生类执行。 - Yuriy

0

我不确定你是否可以直接调用基本方法(可能有一些我不知道的疯狂技巧)。稍微有点替代方案,您是否可以向B类添加方法?如果是这样,请添加:

public void F (int i)
{
    base.F();
}

并使用以下方式调用:

b.F(1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接