Могу ли я вызвать базу для переопределенного метода - PullRequest
3 голосов
/ 27 августа 2010

Можно ли вызвать метод A.F () из экземпляра класса B, кроме использования рефакторинга. Спасибо ..


  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 голосов
/ 27 августа 2010

Вы можете использовать ключевое слово 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 - это не правильное решение, вам следует написать два метода с отличительным именем.


Как правило, базовую реализацию нельзя вызывать извне класса, если метод правильно переопределен. Это концепция ОО. У вас должен быть другой метод . Есть четыре способа (я могу придумать), чтобы определить этот выдающийся метод:

  • написать метод с другим именем.
  • написать метод с тем же именем, но с другой подписью (аргументы). Это называется перегрузкой.
  • написать новое определение метода с тем же именем (используйте ключевое слово new). Это называется скрытием.
  • Поместите его в интерфейсы и реализуйте хотя бы один явно. (аналогично new, но на основе интерфейса)
3 голосов
/ 27 августа 2010

Вам нужно base.F();

1 голос
/ 27 августа 2010

Вы можете вызывать базовый метод только из самого определения класса.Так что если у вас есть необходимость сделать это, вам придется сделать это там.Возможно, вам придется перегрузить этот метод для вызова базового метода из внешнего источника (аналогично тому, как @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(); 
        } 
    }
  }
1 голос
/ 27 августа 2010

вы можете использовать base.method() в производном классе для вызова метода в базовом классе.

0 голосов
/ 27 августа 2010

Я не уверен, что вы можете вызвать базовый метод напрямую (это может быть сумасшедший трюк, о котором я не знаю).В качестве небольшой альтернативы, вы можете добавить методы в класс B?Если это так, добавьте:

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

и назовите его, используя:

b.F(1);
...