在以下示例中“测试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");
}
感谢你们,男士们和女士们。
答案 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)
你可以用反射完成你想要的东西。
然而,虽然我不清楚你的终极目标是什么,但我很清楚你实际上并不想做你想要的事情。我建议你花一些时间重新教育自己的多态性和面向对象的编程。