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();
那将调用新声明的方法.
总结以上是内存溢出为你收集整理的c# – 从基类调用子类的新方法全部内容,希望文章能够帮你解决c# – 从基类调用子类的新方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)