C#学习第十一天 实现多态:虚方法、抽象类
2015-05-04 20:41
295 查看
一、面向对象基础之多态
面向对象里最高级的一个特征!
概念:让一个对象能够表现出多种状态(类型)
有多个类继承自同一个类,同名的方法中功能却不同,如果要写的话,要单独每一个写一下
实现多态的3种手段:
1、虚方法;
1)第一步:将父类的方法标记为虚方法,使用关键字---virtual,说明这个方法可以被重写(这个函数也可以被调用,也可以实现功能)
2)第二步:在子类的此同名方法使用关键字----override,重写这个方法
就会自动调用相应的子类的方法,多种输出
2、抽象类;
当父类中的方法不知道如何去实现的时候,可以考虑将父类写成“抽象类”,将父类的方法写成抽象方法,用关键字:abstract
抽象类不能创建对象,只能创建子类的对象
要注意的地方:
1)抽象类的抽象成员,必须是抽象的,不能有任何实现,并且子类必须重写;
2)抽象类可以有非抽象成员,子类能继承并且不需要重写
3)抽象类不能实例化(不能创建对象)
4)子类必须重写父类的所有抽象类,除非子类也是抽象类
5)子类重写抽象方法时,参数和返回值必须一一对应(一样)
如果父类中的方法有默认的实现,并且父类需要实例化(创建对象),这种多态用”虚方法“实现,父类定义成普通类
如果父类中的方法不需要默认的实现,并且不需要实例化(创建对象),这种多态就用”抽象类“来实现,把父类定义成抽象类
面向对象里最高级的一个特征!
概念:让一个对象能够表现出多种状态(类型)
有多个类继承自同一个类,同名的方法中功能却不同,如果要写的话,要单独每一个写一下
Chinese cn1 = new Chinese("韩梅梅"); Chinese cn2 = new Chinese("李雷"); Japanese j1 = new Japanese("树下君"); Japanese j2 = new Japanese("井边子"); Korea k1 = new Korea("金秀贤"); Korea k2 = new Korea("金贤秀"); American a1 = new American("科比"); American a2 = new American("奥尼尔"); Person[] pers = {cn1,cn2,j1,j2,k1,k2,a1,a2}; for(int i=0;i<pers.Length;i++) { // if(pers[i] is Chinese) // ((Chinese)pers[i]).SayHello(); // if(pers[i] is Japanese) // ((Japanese)pers[i]).SayHello(); // if(pers[i] is Korea) // ((Korea)pers[i]).SayHello(); // if(pers[i] is American) // ((American)pers[i]).SayHello(); //是否可以简化以上代码,使用一个对象表象出多种类型,用一个对象完成上述功能 pers[i].SayHello();
实现多态的3种手段:
1、虚方法;
1)第一步:将父类的方法标记为虚方法,使用关键字---virtual,说明这个方法可以被重写(这个函数也可以被调用,也可以实现功能)
public virtual void <span style="font-family: Arial, Helvetica, sans-serif;">SayHello</span>()
2)第二步:在子类的此同名方法使用关键字----override,重写这个方法
public override void <span style="font-family: Arial, Helvetica, sans-serif;">SayHello</span>()
pers[i].SayHello();
就会自动调用相应的子类的方法,多种输出
2、抽象类;
当父类中的方法不知道如何去实现的时候,可以考虑将父类写成“抽象类”,将父类的方法写成抽象方法,用关键字:abstract
public abstract class Animal { public abstract void Bark(); //抽象方法---没有方法体: 存在的意义就是让方法重写,来实现多态 }子类重写也是用关键字override
抽象类不能创建对象,只能创建子类的对象
Animal a = new Dog();具体调用哪个方法取决于创建哪个子类的对象
要注意的地方:
1)抽象类的抽象成员,必须是抽象的,不能有任何实现,并且子类必须重写;
2)抽象类可以有非抽象成员,子类能继承并且不需要重写
3)抽象类不能实例化(不能创建对象)
4)子类必须重写父类的所有抽象类,除非子类也是抽象类
5)子类重写抽象方法时,参数和返回值必须一一对应(一样)
如果父类中的方法有默认的实现,并且父类需要实例化(创建对象),这种多态用”虚方法“实现,父类定义成普通类
如果父类中的方法不需要默认的实现,并且不需要实例化(创建对象),这种多态就用”抽象类“来实现,把父类定义成抽象类
相关文章推荐
- C#.NET学习笔记---C#中方法覆盖时override和new的比较,abstract和virtual的比较(含C#多态的实现)
- C# 适应虚函数,抽象类,接口分别实现多态的方法总结。
- C# 你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )
- C#多态的实现:虚方法、抽象类、接口
- 《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)
- 浅谈C# 多态的魅力(虚方法,抽象,接口实现)
- C#学习二之多态的实现
- c#多态之抽象类与虚方法的异同点~
- 浅谈C# 多态的魅力(虚方法,抽象,接口实现)
- c#学习 12/22 虚方法和抽象类
- C#--抽象类、抽象方法、多态机制
- c#中多态的学习与使用方法以及重写(覆盖)和重载的区别
- Lua的系统学习(杂)_通过Lua调用C#方法(热更新最直观的原理理解)_简单的随机数实现
- 面向对象,类的组合关系,继承,实现,方法重写,方法重载,this的使用,抽象方法和抽象类的比较,父类构造方法存在的意义,多态的是用和解析,各种访问修饰符
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
- 学习抽象类和接 4000 口的实现,抽象方法的创建和实现
- C#抽象类及其方法的学习
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- C#学习笔记之多态之虚方法
- C#学习笔记之多态之抽象类