2010-08-27 3 views
3

Est-il possible d'invoquer la méthode A.F() à partir de l'instance de la classe B, à l'exception de l'utilisation du refactoring. Merci ..Puis-je appeler la base pour la méthode surchargée


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

Répondre

6

Vous peut utiliser le mot-clé new pour avoir une autre définition de la méthode même (du nom). En fonction du type de référence, vous appelez l'implémentation A de 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(); 
} 

Si vous pensez que new est pas la bonne solution, vous devriez envisager d'écrire deux méthodes avec un nom distinctif.


Généralement, vous ne pouvez pas appeler l'implémentation de base depuis l'extérieur de la classe si la méthode est correctement substituée. C'est un concept OO. Vous devez avoir une autre méthode. Il y a quatre façons (je peux penser à) pour spécifier cette méthode distinguée:

  • écrire une méthode avec un autre nom.
  • écrire une méthode avec le même nom mais une autre signature (arguments). C'est ce qu'on appelle la surcharge.
  • écrire une nouvelle définition de la méthode avec le même nom (utiliser le mot-clé new) Cela s'appelle se cacher.
  • Mettez-le sur les interfaces et implémentez au moins un explicitement. (similaire à new, mais basé sur l'interface)
1

vous pouvez utiliser base.method() dans la classe dérivée pour appeler la méthode dans la classe de base.

+0

Oui, je sais cela ... Mais je veux exécuter A.F() de la fonction principale, pas de la classe dérivée .. – Yuriy

0

Je ne sais pas si vous pouvez appeler la méthode de base directement (peut-être un truc fou là-bas que je ne suis pas au courant). Comme alternative, pouvez-vous ajouter des méthodes à la classe B? Si oui, ajoutez:

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

et l'appeler à l'aide:

b.F(1); 
1

Vous ne pouvez appeler la méthode de base à partir de la définition de la classe elle-même. Donc, si vous avez besoin de le faire, vous devrez le faire là-bas. Il se peut que vous deviez surcharger cette méthode pour appeler la méthode de base à partir d'une source externe (similaire à comment @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(); 
     } 
    } 
    } 
Questions connexes