2010-12-06 5 views
0

Je la situation suivanteImpossible de remplacer la méthode virtuelle C#

public interface IFoo 
{ 
    void Bar(); 
} 
public class Parent : IFoo 
{ 
    public virtual void Bar(){} 
} 
public class Child : Parent, IFoo 
{ 

    public override void Bar(){} 

} 

IFoo test = new Child(); 
test.Bar(); 

test.Bar() appelle toujours la méthode mère!

Toute aide serait grandement appréciée !!

+3

Le code vous avez posté ne compile pas: il ne peut pas y avoir le modificateur 'public' dans' IFoo.Bar'. Par conséquent, nous ne pouvons pas dire ce qui ne va pas avec votre code. S'il vous plaît poster le vrai morceau de code dépouillé au cœur de votre problème. Très probablement, vous implémentez 'IFoo.Bar' explicitement dans' Parent' et donc 'Child' ne le surchargera pas. –

+0

Vous allez devoir fournir plus de code. Ce test provoque l'exécution de 'Child.Bar' ici. (Et votre définition d'interface est syntaxiquement incorrecte - les membres de l'interface n'ont pas de spécificateurs de visibilité.) – cdhowie

+0

Votre exemple ne compile pas. Voulais-tu faire de Parent une classe abstraite? – asawyer

Répondre

1

Cela ne devrait se produire que si vous l'implémentez explicitement.

Je viens de tester et cela fonctionne.

0

WorksForMe: Le problème doit être ailleurs, lorsque je lance ce code, je vois que la méthode enfant est appelée correctement. Pour compiler votre code, j'ai dû supprimer "public" de la méthode dans l'interface et j'ai donné un corps aux deux méthodes Bar().

0

C# 4.0 dit que vous avez une erreur dans la syntaxe - public interface IFoo { void Bar(); } - modificateurs d'accès ne sont pas valables ici Donc, si enlever « public », le code se déroulera avec la version enfant de la méthode comme prévu par vous

+1

Si elle ne compile pas, ça ne va pas fonctionner du tout. Par conséquent, cela ne peut pas être le vrai problème. Je soupçonne que le PO a publié un code fabriqué qui est similaire au code réel, mais pas assez proche pour nous de diagnostiquer le problème réel. (Et ce code fabriqué a des erreurs de syntaxe, vraisemblablement le vrai code ne le fait pas.) – cdhowie

+0

oui, mais dans cette situation - c'est une bonne solution - erreur de syntaxe dans la déclaration d'interface, car dans tous les autres cas "override" –

Questions connexes