red*_*red 3 c# methods invoke base-class new-operator
我有类似这样的课程
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
A a = new C();
a.method();
Console.ReadLine();
}
}
public class A
{
public virtual void method()
{
Console.WriteLine("METHOD FROM A");
}
}
public class B : A { }
public class C : B
{
public override void method()
{
Console.WriteLine("METHOD FROM C");
}
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,打印"METHOD FROM C"
但
如果我有这样的情况
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
A a = new C();
a.method();
Console.ReadLine();
}
}
public class A
{
public void method()
{
Console.WriteLine("METHOD FROM A");
}
}
public class B : A { }
public class C : B
{
public new void method()
{
Console.WriteLine("METHOD FROM C");
}
}
}
Run Code Online (Sandbox Code Playgroud)
它打印"METHOD FROM A".如果没有采用带有覆盖的强制转换或更改方法声明,如何获得第一个示例的相同行为?
Jon*_*eet 11
你不能 - 这种行为上的差异是使用虚拟/覆盖的重点.
当你用"new"声明一个方法时,你会说"我知道我隐藏了一个具有相同签名的方法,而不是覆盖它;我不想要多态行为."
同样,当您声明一个方法而不指定"virtual"时,您会说"我不希望子类能够覆盖此方法".
你为什么要这样做?你真的只是试图覆盖一个尚未声明为虚拟的方法吗?如果是这样的话,那就没有办法了 - 而且有充分的理由.如果作者没有在设计具有多态性的类时,如果能够覆盖该方法,则很容易破坏.
当然,如果您将变量声明为子类的类型,如下所示:
C c = new C();
c.method();
Run Code Online (Sandbox Code Playgroud)
那将调用新声明的方法.
| 归档时间: |
|
| 查看次数: |
2027 次 |
| 最近记录: |