2009-07-22 6 views
4

J'ai besoin de savoir quelque chose sur l'héritage en C#. J'ai une classe ci-dessous:Héritage en C# et appel à base.X() en utilisant la fonction surchargée Y()

Class BaseClass 
{ 
    public void X() 
    { 
     //Some code here 
     Y(); 
    } 

    public void Y() 
    { 
     //Some code here 
    } 
} 

Maintenant, je veux créer une autre classe (ChildClass) qui découle de BaseClass. Le problème est que je veux en quelque sorte surcharger la fonction Y() dans ChildClass, et lorsque la fonction base.X() est appelée, je veux que la fonction X() utilise la fonction Y() surchargée dans ChildClass. Quelqu'un m'a suggéré d'utiliser le mot-clé 'delegate' pour la fonction Y lors du remplacement. Mais, je ne suis pas sûr que ça va marcher.

Est-ce possible? Aucune suggestion?

Répondre

19
class BaseClass 
{ 
    public void X() 
    { 
     // Some code here 
     Y(); 
    } 

    public virtual void Y() 
    { 
     // Some code here 
    } 
} 

class ChildClass : BaseClass 
{ 
    public override void Y() 
    { 
     // Some code here 
    } 
} 

Si à un moment donné que vous voulez appeler, vous pouvez le faire cette mise en œuvre BaseClass de Y() dans le ChildClass:

class ChildClass : BaseClass 
{ 
    public override void Y() 
    { 
     // Some code here 
     base.Y(); 
    } 
} 
+0

Veuillez noter que ce n'est pas vraiment un modèle recommandé (appelant une méthode virtuelle d'un constructeur). vous ne pouvez pas savoir si la fonction prioritaire est implémentée correctement. si elle déclenche une exception, cette exception déclenchera et sortira le constructeur. lancer une exception d'un constructeur est mauvais. –

+0

@ oɔɯǝɹ: Il n'y a aucun problème avec les constructeurs qui lancent des exceptions dans C#/.NET, et en fait, de nombreuses classes de framework le font. Le problème réel concernant l'appel de méthodes virtuelles dans les constructeurs est que ChildClass.Y() 'peut être basé sur l'initialisation complète de ChildClass (en particulier, les champs privés que ChildClass peut avoir), ce qui n'est pas le cas à ce moment-là. lorsque le constructeur 'BaseClass' est exécuté. –

+0

@ O.R.Mapper: vous avez raison, je suis confondu avec les exceptions du constructeur de classe statique. Ce sont méchants. –

0

Il est possible. Il est connu comme le modèle template. Déclarez votre fonction Y() dans la classe de base, mais marquez-la comme abstraite. Dans votre classe dérivée, remplacez cette fonction. Appeler X() appellera alors la fonction correcte.

+1

Il n'est pas nécessaire d'utiliser le modèle de modèle - il suffit de rendre Y virtuel ... –

+0

Oui, vous pouvez utiliser virtuel ou abstrait. Le principe est toujours valable. – DanDan

Questions connexes