2013-06-12 3 views
1

У меня есть абстрактный базовый класс, и я наследую его от сборки расширения. И вот мой код region Contract AssemblyC# переопределение виртуальных методов в классе MEF не работает

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 
    } 
} 

Есть ли различия между переопределением виртуальных и абстатических методов, о которых я не знаю, или это конкретный случай для MEF? Спасибо за любую помощь ...

+0

Я столкнулся с той же проблемой. Вы пришли к решению? –

ответ

3

Вы не объявляете ForVirtualMethod как виртуальный на BaseClass. Измените его на этом

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

Проверить MSDN для получения более подробной информации о декларации виртуальных членов

Виртуальное ключевое слово используется для изменения метода, свойства, индексатор или событий декларации, и дать ему возможность быть переопределен в производный класс.

+0

Мне очень жаль. Я забыл добавить виртуальное ключевое слово. Фактически это виртуально в моем реальном коде. Я просто попытался прояснить ситуацию, написав какой-то фиктивный код и забыл добавить виртуальный. – ayk

+0

@dopache: это странно. Что делает «GetInstanceFromCatalog»? –

+0

Это всего лишь фрагмент кода для читателей, который упоминает, что фиктивный экземпляр не вышел из ниоткуда. – ayk