2014-05-23 3 views
-1

J'ai une classe qui est utilisée comme classe parent et qui a la fonction c() que je veux remplacer dans la classe dérivée mais la fonction de la classe de base c est appelée. Voici le code de pseudo pour mon class.may être ce mot-clé donne un tout sens différent ensembleAppel d'une fonction dérivée de la classe Derived dans C#

public Class BaseRepository 
{ 
    public A() 
    { 
     this.c(); 
    } 

    public B() 
    { 
     this.c(); 
    } 

    protected virtual c() 
    { 
     enter code here 
    } 
} 

quand je tire cette classe

class customRepo:BaseRepository 
{ 
    protected override c() 
    { 
     ...does something 
    } 
} 

Ma fonction de prise en pension personnalisée n'utilise pas le c() de classe de repo personnalisé, mais la fonction de base repo est utilisée. Quelqu'un peut-il me dire pourquoi cela se produit ???

+1

Cela semble bien à condition que vous êtes réellement affaire à une instance de la classe customRepo. Votre problème pourrait-il être que votre fonction c surchargée a un appel à 'base.c();'? – McAden

+2

Comment l'appelez-vous? Avez-vous instancié un Repo personnalisé ou un BaseRepository? Si vous instanciez la classe de base, elle ne sait rien de la classe dérivée. – BradleyDotNET

+0

+1 McAden et Bradley.Net. Veuillez montrer comment vous appelez c() et éventuellement des parties pertinentes dans la méthode. – Mzn

Répondre

2

La raison la plus probable (et seulement je peux venir avec) que cela se produirait est que vous instanciez un BaseRepostiory au lieu d'un objet customRepo.

Polymorphisme invoque la fonction la plus dérivée du type qui a été effectivement créé, créant ainsi un objet customRepo invoquera customRepo.C, et la création d'un BaseRepository invoquera BaseRepository.C.

Pour plus de détails, les classes ne connaissent pas magiquement leurs dérivations et n'appellent pas de méthodes dérivées. Cela est logique, car si vous aviez plusieurs dérivations, quelle méthode appelleriez-vous? La ligne suivante fonctionnera comme prévu (appeler la classe dérivée):

BaseRepository custom = new customRepo(); 
custom.A(); 

Celui-ci ne sera pas:

BaseRepository base = new BaseRepostiory(); 
base.A(); 
+0

J'essayais d'instancier une mauvaise classe avec un nom d'aile – gaurus

Questions connexes