我可以为重写方法调用base

时间:2010-08-27 12:18:57

标签: c# .net oop override

除了使用重构之外,是否可以从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 个答案:

答案 0 :(得分:6)

可能使用new关键字来获得相同(命名)方法的另一个定义。根据引用的类型,您可以调用A实现的B

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不是正确的解决方案,您应该考虑使用专有名称编写两种方法。


通常,如果方法被正确覆盖,则无法从类外部调用基本实现。这是一个OO概念。您必须有其他方法。有四种方法(我可以想到)来指定这种区分方法:

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

答案 1 :(得分:3)

您需要base.F();

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您只能从类定义本身中调用基本方法。因此,如果您需要这样做,那么您必须在那里完成。这可能归结为你必须重载该方法以从外部源调用基本方法(类似于@Edward Leno mentiods的方式)。

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(); 
        } 
    }
  }

答案 4 :(得分:0)

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

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

并使用以下方式调用它:

b.F(1);