我们举一个测试例子:
class A
{
public A()
{
this.Test(); //I want to call Test exactrly from class A!!! here
}
public virtual void Test ()
{
Console.WriteLine("I am A!");
}
}
class B : A
{
public B() { }
public override void Test()
{
Console.WriteLine("I am B!");
}
}
//Somewhere in code
B b = new B(); //I want It displays "I am A" instead of "I am B"
有没有办法这样做? P.S。:我知道这是一个糟糕的设计,但我想知道,以提高我对C#的了解。
答案 0 :(得分:3)
否 - 您无法以非虚拟方式调用虚方法。 (不是直接来自C#,无论如何......你可以在IL中,但你不能在C#中表达它。)
在这种情况下,如果希望进行调用的代码在A中,那么您只需创建一个包含您感兴趣的行为的非虚方法,然后可能从虚拟中调用该非虚方法方法也是。
答案 1 :(得分:2)
拥有和过度使用metheod的意义在于,您可以透明地替换功能并期望该类能够合理地运行。你所要求的是一个基础类,可以从中获得有关类的知识......这不是OO设计的原则。
如果你想调用一个尚未覆盖的方法,请不要使该方法过度使用。
答案 2 :(得分:0)
如果覆盖虚拟方法,则不能。但你可以这样做,如果你用新的隐藏它(即使我不这样做,但你已经知道这是糟糕的设计: - ))。
我的意思是如果你在B类中定义你的Test方法:
public new void Test()
{
Console.WriteLine("I am B!");
}
然后执行它,声明你将B实例赋值为A类的变量,你得到你想要的东西:
A b = new B();
b.Test();
如果你想执行方法的B版本,你只需要将变量声明为A:
B b = new B();
b.Test();