繁体   English   中英

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

[英]May I to specify from which class I want to call a virtual method?

让我们来看一个测试示例:

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"

有办法吗? PS:我知道这是一个糟糕的设计,但是我想知道以提高对C#的了解。

不可以-您不能以非虚拟方式调用虚拟方法。 (无论如何,不​​是直接从C#中获得的...您可以在IL中使用,但不能在C#中表达出来。)

在这种情况下,如果希望进行调用的代码在A中,那么您可以仅创建一个包含您感兴趣的行为的非虚拟方法,然后还可以从虚拟方法中调用该非虚拟方法。

具有和过高的方法的要点是,您可以透明地替换功能,并期望类合理地运行。 您要的是基础类,以了解有关类的知识,这些类可能由此而来……这不是OO设计的原理。

如果要调用未被重写的方法,请不要使该方法成为可重写的。

如果您覆盖虚拟方法,则无法执行。 但是,如果您用new来隐藏它,则可以执行此操作(即使我不愿意这样做,但您已经知道这是不好的设计:-))。

我的意思是,如果您像这样在B类中定义Test方法:

        public new void Test()
        {
            Console.WriteLine("I am B!");
        }

然后执行它,声明您将B的实例分配为A类型的变量,您将获得所需的内容:

A b = new B();
b.Test();

如果要执行方法的B版本,则只需将tha variabla声明为A:

B b = new B();
b.Test();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM