2013-06-12 1 views
1

J'ai une classe de base abstraite et j'en hérite dans un assembly d'extension. Et voici mon code region Contract AssemblyC# surcharger les méthodes virtuelles dans la classe MEF ne fonctionne pas

public interface IDummy 
{ 
    int ForAbstractMethod(); 
    int ForVirtualMethod(); 
} 

public abstract class BaseClass : IDummy 
{ 
    public abstract int ForAbstractMethod(); 

    public virtual int ForVirtualMethod() 
    { 
     //Some base functionality 
     return 0; 
    } 
} 
#endregion 

#region Extension Assembly 

public class SomeExtension : BaseClass 
{ 
    public override int ForAbstractMethod() 
    { 
     //I implement this method here, which is defined abstract in base class and this one works fine. 
     return 100; 
    } 

    public override int ForVirtualMethod() 
    { 
     //Even though I override the virtual one here, still the one in the base class executes. 
     return 1; 
    } 
} 

#endregion 


#region Main Program Assembly which references Contract Assembly 

public class Program 
{ 
    void Main() 
    { 
     //... compose catalog and other stuff 

     IDummy dummy = someFactory.GetInstanceFromCatalog<IDummy>();//I get an instance 
     int a = dummy.ForAbstractMethod();//this works as expected and returns 100 
     a = dummy.ForVirtualMethod();//here I expect it to return 1 since I overrode it in child class, but it returns still 0. 

     //...other stuff 
    } 
} 

Existe-t-il des différences entre les méthodes virtuelles et abstact prioritaires que je ne connais pas ou il s'agit d'un cas spécifique pour MEF? Merci pour toute aide ...

+0

J'ai rencontré le même problème. Êtes-vous arrivé à une décision? –

Répondre

3

Vous ne déclarez pas ForVirtualMethod comme virtuel sur BaseClass. Changez-le à cette

public virtual int ForVirtualMethod() 
{ 
    //Some base functionality 
    return 0; 
} 

Vérifiez MSDN pour plus de détails sur la déclaration des membres virtuels

Le mot-clé virtuel est utilisé pour modifier une méthode, propriété, indexeur ou déclaration événement, et lui permettre d'être redéfinie dans une classe dérivée.

+0

Je suis tellement désolé. J'ai oublié d'ajouter un mot-clé virtuel. C'est en fait virtuel dans mon vrai code. J'ai juste essayé de clarifier les choses en écrivant du code fictif et j'ai oublié d'ajouter du virtuel. – ayk

+0

@dopache: c'est bizarre. Que fait 'GetInstanceFromCatalog'? –

+0

C'est juste un morceau de code pour les lecteurs de mentionner que l'instance factice n'est pas sorti de nulle part. – ayk

Questions connexes