[英]How do I call a base virtual method from another method in the base class without calling the overrides?
[英]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.