多态
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 | namespace Protected { class Program { static void Main( string [] args) { Parent p = new Child(); Console.WriteLine(p.X); Console.WriteLine(p.test()); Console.WriteLine(p.test1()); Console.ReadLine(); } } public class Parent { public Parent() { Add(2); } public int X = 10; protected int Add( int y) { return X += y; } public virtual int test() { return 0; } public int test1() { return 0; } } public class Child : Parent { public int X = 9; public override int test() { return 15; } public int test1() { return 15; } } } |
输出依次为12、15、0 可以看到
Parent p = new Child();
这里其实调用的是父类的X,也就是声明了一个孩子的人类对象。
这样做的好处是,比如有个计算器的基类,现在有一个加法运算类,如果以后再次扩展,只需加一个减法的运算类继承基类、然后直接 基类 a=new 减法类() 就可以了,不需要改变基类中的代码。
直观的解释:
对外接口可能只是父类,这样可以方便你在内部扩展子类,比方说你又增加了一个子类,外面接口不用改变
这就好比,你学习计算机学习的是面向通用的计算机的知识,学好以后,你去具体使用计算机,那么使用的是某个品牌某个型号的计算机,但是你不用关心它具体怎么实现的,你用通用的知识就可以驾驭它。
关于后两个值的解释:
另外需要注意ovrride,如果子类中不重写父类的方法test,那么调用的是父类的方法。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 个人数据保全计划:从印象笔记迁移到joplin
· Vue3.5常用特性整理
· 重拾 SSH:从基础到安全加固
· 并发编程 - 线程同步(一)