2010-06-14 53 views
0

在以下示例中,“测试v1函数被调用”失败。有没有办法通过“class 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"); 
    } 

感谢您的期待,家伙和女孩。

回答

4

类继承的要点是它允许您覆盖选定的基类行为。

您可以使用V2中的base关键字调用V1的基类代码,但不能在课程外做到这一点。正如使用的一个简单的例子:

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

另外,您可以实例化V1一个实例:

var v1 = new V1(); 
+0

谢谢。但为了我的目的,我必须通过V2调用它。我无法实例化V1。 – 7wp 2010-06-14 21:03:10

+0

V1是抽象类吗? – 2010-06-14 21:05:30

+0

我对你想做什么感到困惑,但是通过'V2'来访问'V1'基本方法,你将不得不修改'V2'以某种方式提供一个方法或参数来触发一个调用'base.RunFunction()'。 – 2010-06-14 21:05:34

1

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

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

1

你可以用Reflection完成你想要的。

但是,虽然目前还不清楚你的目标是什么,但我很清楚你并不真正想做你要求的东西。我建议你花一些时间重新研究自己的多态性和面向对象编程。

+0

我知道你可能会对我正在尝试做的事感到困惑,请阅读我在@Justin Ethier的回答下的评论。 – 7wp 2010-06-15 14:34:12