C#的多态性
参考网址:http://www.cnblogs.com/zhangkai2237/archive/2012/12/20/2826734.html
多态的定义:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。
在理解多态之前了解几个概念:重载,重写,虚方法,抽象方法以及隐藏方法。
1、重载:在同一个作用域(一般指一个类)两个或多个方法函数名相同,参数列表不同的方法叫做重载,他们有三个特点
(1)方法名必须相同
(2)参数列表必须不相同
(3)返回值类型可以不相同
1 2 3 4 5 6 7 8 9 10 | public void Sleep(){ cw( "Animal睡觉" ); } public int sleep(){ cw( "Animal几点睡觉" ); } public void Sleep( int time) { cw( "Animal{0}点睡觉" ,time); } |
2、重写:子类中满足自己的需要来重复定义某个方法的不同实现,需要用override关键字,被重写的方法必须是虚方法,用的是virtual关键字。
(1)相同的方法名。
(2)相同的参数列表。
(3)相同的返回值。
1 2 3 4 5 6 7 8 9 10 | 父类中的定义: public virtual void EatFood() { cw( "Animal吃东西" ) ; } 子类中的定义 public override void EatFood(){ cw( "cat吃东西" ); } |
tips:虚方法能直接被调用
4、抽象方法:在基类中定义的并且在派生类中重写的方法,使用abstract关键字定义。如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 基类: public abstract class Biology { public abstract void Live(); } 子类 public class Animal:Biology { public override void Live() { cw( "Animal重写的抽象方法" ); } } tips :抽象类中可以包含抽象类,也可以包含已经实现的。 已经实现的类不能包含抽象类。 |
5、隐藏方法:在派生类中定义的和基类中的某个方法同名的方法,使用new关键字定义。如在基类Animal中有一方法sleep();
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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | public void Sleep(){ cw( "Animal Sleep" ); } 在派生类cat中定义隐藏方法的代码为: new public void Sleep(){ cw( "Cat Sleep" ); } 或 public new void Sleep() { cw( "Cat Sleep" ); } tips:(1)隐藏方法不但可以隐藏基类中的虚方法,而且可以隐藏基类中的非虚方法 (2)隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法 (3)和上条对比:重写方法中子类的变量调用子类重写的方法,父类的变量要看这个父类引用的是子类的实例还是本身的实例,如果调用的是父类的实例,那么调用基类的方法,如果引用的是派生类的实例,则调用派生类的方法。 详细解说: class Program { static void Main( string [] args) { //Animal 的实例 Animal a = new Animal(); a.EatFood(); //Animal 的实例,引用派生类Cat对象 Animal ac = new Cat(); ac.EatFood(); ac.Sleep(); Cat c = new Cat(); c.Sleep(); //Animal的实例,引用派生类Dog对象 Animal ad = new Dog(); Console.ReadKey(); } } public abstract class Biology { public abstract void Live(); } public class Animal : Biology { public override void Live() { Console.WriteLine( "Animal重写的Live" ); } public void Sleep() { Console.WriteLine( "Animal Sleep" ); } public int Sleep( int time) { Console.WriteLine( "Animal在{0}点Sleep" ,time); return time; } public virtual void EatFood() { Console.WriteLine( "Animal EatFood" ); } } public class Cat : Animal { public override void EatFood() { Console.WriteLine( "Cat EatFood" ); } new public void Sleep() { Console.WriteLine( "Cat Sleep" ); } } public class Dog : Animal { public override void EatFood() { Console.WriteLine( "Dog EatFood" ); } } 父类 animal 子类 cat 当出现 Animal a= new Cat(); 时,调用的是父类的 的方法。 当出现 Cat c= new Cat();时,调用的是子类的隐藏方法。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现