1

我有一个抽象基类,我在扩展程序集中从它继承。这是我的代码 region Contract Assembly

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 的特定情况?谢谢你的帮助...

4

1 回答 1

3

您没有声明ForVirtualMethod为虚拟 on BaseClass。改成这个

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

有关虚拟成员声明的更多详细信息,请查看MSDN

virtual 关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中对其进行覆盖。

于 2013-06-12T13:42:54.083 回答