我可以指定从哪个类调用虚方法吗?

时间:2011-10-04 14:00:16

标签: c# .net inheritance virtual

我们举一个测试例子:

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#的了解。

3 个答案:

答案 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();