c# 继承,多态,new /overrid 区别, 引用父类的方法
好久没碰c#了,偶尔需要制作点小工具。为了一个灵活的架构设计,需要对继承/多态有比较深刻的理解。
不料忘得差不多了,好吧,再来回忆下。直接上代码了,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestInherit { class A { public A() { Console.WriteLine( "==constructor of A===" ); } public void M1() { Console.WriteLine( "A:M1()" ); } public virtual void M2() { Console.WriteLine( "==abstract method A:M2====" ); } } class B : A { public B() { Console.WriteLine( "==constructor of B===\r\n" ); } public new void M1() { //base.M1();//通过base引用父类 Console.WriteLine( "B:M1()\r\n" ); } public override void M2() //abstract 和 virtual 一样,必需配合override使用,不同的是前者不能有具体的方法体。 { //base.M2(); Console.WriteLine( "==concret method B:M2====\r\n" ); } } class Program { static void Main( string [] args) { Console.WriteLine( "====继承测试(new)===========" ); B b = new B(); Console.Write( "调用子类的同名方法:" ); b.M1(); Console.WriteLine( "====继承测试(overrid)===========" ); B bb = new B(); Console.Write( "调用子类的同名方法:" ); bb.M2(); Console.WriteLine( "====多态测试(new 关键字)===========" ); A b2 = new B(); Console.Write( "通过父类的引用调用同名方法:" ); b2.M1(); // new 不支持多态 Console.WriteLine( "====多态测试(override 关键字)===========" ); A b3 = new B(); Console.Write( "通过父类的引用调用同名方法:" ); b3.M2(); // overrid 不支持多态 Console.Read(); } } } |
输出如下:
1. 在继承上, new/override没区别
2. 在多态上,new不支持多态,override支持
3. 构造函数会自动调用父类的。其他函数不会,需要显示通过 base.同名方法 进行调用
转载请注明来自:http://www.cnblogs.com/Tommy-Yu/p/4028023.html,谢谢!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步