c# – 从基类调用子类的新方法
发布时间:2020-12-15 19:34:59 所属栏目:百科 来源:网络整理
导读:我有类似这样的课程 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"); } }
我有类似这样的课程
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"); } } } 它工作正常,打印“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"); } } } 它打印“METHOD FROM A”.如果没有采用带有覆盖的强制转换或更改方法声明,如何获得第一个示例的相同行为? 解决方法
你不能 – 这种行为上的差异是使用虚拟/覆盖的重点.
当你用“new”声明一个方法时,你会说“我知道我隐藏了一个具有相同签名的方法,而不是覆盖它;我不想要多态行为.” 同样,当您声明一个方法而不指定“virtual”时,您会说“我不希望子类能够覆盖此方法”. 你为什么要这样做?你真的只是试图覆盖一个尚未声明为虚拟的方法吗?如果是这样的话,那就没有办法了 – 而且有充分的理由.如果作者没有在设计具有多态性的类时,如果能够覆盖该方法,则很容易破坏. 当然,如果您将变量声明为子类的类型,如下所示: C c = new C(); c.method(); 那将调用新声明的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |