c# – 从基类调用子类的新方法

c# – 从基类调用子类的新方法,第1张

概述我有类似这样的课程 namespace ConsoleApplication1{ class Program { static void Main(string[] args) { A a = new C(); a.method(); Console.ReadLine(); 我有类似这样的课程

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# – 从基类调用子类的新方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存