强制调用虚拟基本函数而不是覆盖虚函数

时间:2010-06-14 20:51:40

标签: c#

在以下示例中“测试v1函数被调用”失败。有没有办法强制通过“类V2”的实例调用“RunFunction”的基本实现?

    class V1 
    {
        public virtual string RunFunction()
        {
            return "V1";
        }
    }

    class V2 : V1
    {
        public override string RunFunction()
        {
            return "V2";
        }
    }



    [Test]
    public void TestCall()
    {
        var v1 = (V1)new V2();
        var v2 = new V2();

        Assert.IsTrue(v1.RunFunction() == "V1", "Test that v1 function was called");
        Assert.IsTrue(v2.RunFunction() == "V2", "Test that v2 function was called");
    }

感谢你们,男士们和女士们。

3 个答案:

答案 0 :(得分:4)

类继承的全部意义在于它允许您覆盖选定的基类行为。

您可以使用base中的V2关键字来调用V1中的基类代码,但是您不能在课外进行此操作。就像一个快速的使用示例:

class V2 : V1
{
    public override string RunFunction()
    {
        return base.RunFunction();
    }
}

或者,您可以实例化V1的实例:

var v1 = new V1();

答案 1 :(得分:1)

我认为你可能会在子类中使用public new string RunFunction(),但我也建议如果V2不应该提供它自己的特定行为,那么使用继承不是正确的方法。

您还可以尝试在基础上定义静态 - public static string RunFuctionStatic(V1 item),然后调用V1.RunFunctionStatic(v2Instace)。

答案 2 :(得分:1)

你可以用反射完成你想要的东西。

然而,虽然我不清楚你的终极目标是什么,但我很清楚你实际上并不想做你想要的事情。我建议你花一些时间重新教育自己的多态性和面向对象的编程。