《深入理解多态PPT课件》由会员分享,可在线阅读,更多相关《深入理解多态PPT课件(33页珍藏版)》请在金锄头文库上搜索。
1、第五单元(四)第五单元(四)第五单元(四)第五单元(四)深入理解多态深入理解多态回顾与作业点评在子类中访问父类成员的关键字是什么?在子类中访问父类成员的关键字是什么?方法重载和方法重写的区别?方法重载和方法重写的区别?笔记本支持用户使用电池笔记本支持用户使用电池(AcPower)和电源和电源(Battery)两两种方式进行供电种方式进行供电使用多态性输出目前笔记本的电源供电情况使用多态性输出目前笔记本的电源供电情况“XX供电中供电中”参考答案参考答案预习检查子类中定义抽象类的关键字是什么?子类中定义抽象类的关键字是什么?as关键字的作用?关键字的作用?本章任务使用使用OO思想思想实现员工器乐演
2、奏实现员工器乐演奏实现员工执行工作列表、查看工作指标完成情况实现员工执行工作列表、查看工作指标完成情况实现饲养员给不同动物喂食实现饲养员给不同动物喂食理解里氏替换原则理解里氏替换原则会使用父类类型作为参数会使用父类类型作为参数理解抽象类和抽象方法理解抽象类和抽象方法理解虚方法和抽象方法的区别理解虚方法和抽象方法的区别本章目标里氏替换原则/SE ai = new SE();SE joe = new SE();PM gates = new PM();List empls = new List();empls.Add(ai);empls.Add(joe);empls.Add(gates);/子类可以
3、替换父类子类可以替换父类里氏替换原则(里氏替换原则(LSP)在一个软件系统中,子类对象可以替换所有使用的父在一个软件系统中,子类对象可以替换所有使用的父类对象,且程序行为没有变化类对象,且程序行为没有变化里氏替换原则的应用一个鸟类,一个鸵鸟类,如果鸟可以飞,鸵鸟类一个鸟类,一个鸵鸟类,如果鸟可以飞,鸵鸟类可以继承鸟类吗?可以继承鸟类吗?如果鸵鸟类继承鸟类,如果鸵鸟类继承鸟类,违反违反“鸵鸟会飞鸵鸟会飞”根据根据LSP原则:软件设计时,鸵鸟类不能继承鸟类原则:软件设计时,鸵鸟类不能继承鸟类is与as操作符is 检查对象是否与指定类型兼容检查对象是否与指定类型兼容if(emplsi is SE)判
4、断判断empl集合的元素是否集合的元素是否是是SE对象对象as 用于在兼容的引用类型之间执行转换用于在兼容的引用类型之间执行转换 for (int i = 0; i empls.Count;i+ ) if(emplsi is SE) SE se = emplsi as SE; Console.WriteLine(se.SayHi(); 一种类型转换方式一种类型转换方式转换失败返回值为空转换失败返回值为空多态的应用2-1某公司员工回家,可以选择不同交通工具(小某公司员工回家,可以选择不同交通工具(小汽车、地铁、自行车),每种交通工具具有行汽车、地铁、自行车),每种交通工具具有行驶的行为,编程模拟
5、员工回家的过程驶的行为,编程模拟员工回家的过程多态的应用2-2交通工具具有继承关系交通工具具有继承关系GoHome(TrafficTool tool)演示示例:多态的应用演示示例:多态的应用父类类型作为参数父类类型作为参数父类类型作为参数2-1实现交通工具继承关系实现交通工具继承关系public class TrafficTool public virtual void Run() Console.WriteLine(车在行使!车在行使!); public class Car:TrafficTool public override void Run() Console.WriteLine(小汽
6、车在行使!小汽车在行使!); 父类类型作为参数2-2实现员工回家实现员工回家public class Employee . public void GoHome(TrafficTool tool) Console.WriteLine(员工:员工:+this.Name); tool.Run(); List empls = new List();empls.Add(ai);empls.Add(joe);/员工选择不同交通工具回家员工选择不同交通工具回家empls0.GoHome(new Bicycle();empls1.GoHome(new Tube();父类作为参数使用,可父类作为参数使用,可接
7、受多种子类类型接受多种子类类型传递实际创建的子类对传递实际创建的子类对象,象,tool.Run()执行相执行相应子类的应子类的Run()小结实现多态的步骤:实现多态的步骤:子类重写父类的方法子类重写父类的方法两种方式两种方式创建父类变量,实例化子类对象创建父类变量,实例化子类对象把父类类型作为参数类型,该子类及子类对象作为参数传入把父类类型作为参数类型,该子类及子类对象作为参数传入运行时,根据实际创建的对象决定执行哪个方法运行时,根据实际创建的对象决定执行哪个方法指导实现器乐演奏训练要点训练要点父类类型作为参数父类类型作为参数需求说明需求说明公司举办器乐大赛,员工可以选择不同的乐器进行公司举办
8、器乐大赛,员工可以选择不同的乐器进行演奏,模拟演奏过程演奏,模拟演奏过程难点分析难点分析不同器乐继承自不同器乐继承自Instrument类类员工具有员工具有Play(乐器类型乐器类型)方法方法public void Play(Instrument XX) XX.Play();支持传入多种子类对象,避免为支持传入多种子类对象,避免为每一个子类类型编写方法每一个子类类型编写方法完成时间:完成时间:25分钟分钟共性问题集中讲解n常见调试问题及解决办法常见调试问题及解决办法n代码规范问题代码规范问题共性问题集中讲解共性问题集中讲解为什么需要抽象方法public class TrafficTool pu
9、blic virtual void Run() Console.WriteLine(车在行使!车在行使!); 交通工具类是抽象的概念,根交通工具类是抽象的概念,根本不可能实例化,本不可能实例化,Run()方法方法不具有实际意义!不具有实际意义!public abstract class TrafficTool public abstract void Run(); 使用使用抽象类、抽象方法抽象类、抽象方法优化程序优化程序 public abstract class TrafficTool public abstract void Run(); 抽象类和抽象方法抽象方法抽象方法 一个没有实一个没
10、有实现的方法现的方法有抽象方法的类必然是抽象类有抽象方法的类必然是抽象类抽象类用来列举一个类所需要的行为抽象类用来列举一个类所需要的行为抽象类不明确提供具体实现方法抽象类不明确提供具体实现方法抽象类必须由其子类实现它的抽象方法(除非抽象类必须由其子类实现它的抽象方法(除非子类也具有抽象性)子类也具有抽象性)常见错误抽象类不能被实例化抽象类不能被实例化抽象类不能是静态的抽象类不能是静态的TrafficTool tool = new TrafficTool(); 编译错误编译错误抽象类不能用抽象类不能用static修饰修饰实现抽象方法使用使用override实现抽象方法实现抽象方法class Tu
11、be:TrafficTool public override void Run() Console.WriteLine(地铁运行中!地铁运行中!); 重写重写 必须实现抽象父类必须实现抽象父类中的抽象方法中的抽象方法演示示例:抽象类和抽象方法演示示例:抽象类和抽象方法抽象类的实际应用3-1实现员工执行工作列表、查看工作指标完成情实现员工执行工作列表、查看工作指标完成情况况不同工作执行的指标项不同,不同工作执行的指标项不同,因此窗体不同因此窗体不同抽象类的实际应用3-2工作类型有很多且执行指标不同工作类型有很多且执行指标不同编码、测试、审核编码、测试、审核模拟执行工作,模拟执行工作,显示对应类型
12、工显示对应类型工作窗体作窗体显示工作完显示工作完成情况成情况测试类型工测试类型工作特有指标作特有指标编码类型工编码类型工作特有指标作特有指标抽象类的实际应用3-3public abstract class Job .定义公共属性定义公共属性. /执行执行 public abstract void Execute(); /显示显示 public abstract string Show();public class CodeJob:Job /实现抽象实现抽象Job的的Execute方法方法 public override void Execute() FrmCodeExe frmCodeExe
13、= new FrmCodeExe(this); frmCodeExe.ShowDialog(); 演示示例:抽象类的实际应用演示示例:抽象类的实际应用打开不同工作类打开不同工作类型的窗体,填写型的窗体,填写指标执行情况指标执行情况传递当前对象传递当前对象的引用的引用抽象方法抽象方法抽象类的应用场合父类提供一系列规定,约束子类的行为父类提供一系列规定,约束子类的行为Dog : Animal Cat : Animal abstract Animal 猫咪喵喵叫猫咪喵喵叫 狗狗汪汪叫狗狗汪汪叫 abstract 叫叫() 父类可以提供一些共父类可以提供一些共性的行为性的行为抽象类和抽象方法实抽象类和
14、抽象方法实现多态性现多态性对比虚方法抽象类和抽象方法抽象类和抽象方法抽象类通常代表一个抽象的概念抽象类通常代表一个抽象的概念抽象方法约束子类对象的行为抽象方法约束子类对象的行为比如:抽象的动物类,具有抽象方法吃比如:抽象的动物类,具有抽象方法吃()、喝、喝()虚方法虚方法具体类的默认实现,提供其子类扩展实现方式具体类的默认实现,提供其子类扩展实现方式比如:数据库连接类,比如:数据库连接类,Connect()方法实现与方法实现与SQL Server的连接,数据库连接子类继承并重写它,实现与的连接,数据库连接子类继承并重写它,实现与MySQL连连接接抽象方法与虚方法抽象方法抽象方法虚方法虚方法用用
15、 abstract 修饰修饰用用 virtual 修饰修饰不允许有方法体不允许有方法体要有方法体,哪怕是一个分要有方法体,哪怕是一个分号号必须必须被子类被子类 override可以可以被子类被子类 override只能在抽象类中只能在抽象类中除了密封类都可以写除了密封类都可以写抽象类中可以包括抽抽象类中可以包括抽象方法和非抽象方法象方法和非抽象方法 面向对象的三大特性隐藏内部实现,稳定外部接口隐藏内部实现,稳定外部接口 封装封装继承继承子类继承父类成员,实现代码复用子类继承父类成员,实现代码复用 多态多态不同子类对同一个消息作出不同的反映不同子类对同一个消息作出不同的反映 任务任务5.7 5.
16、7 计算圆面积和周长、圆柱计算圆面积和周长、圆柱体面体面积和体积积和体积 任务描述:设计计算器界面设计计算器界面通过多级继承,完成圆通过多级继承,完成圆面积和周长的计算、圆面积和周长的计算、圆柱体面积和体积的计算柱体面积和体积的计算 。将圆心坐标定义为基类,在基类中包含坐标将圆心坐标定义为基类,在基类中包含坐标X属性和属性和Y属性,定义属性,定义Print方法用来输出圆心方法用来输出圆心坐标位置坐标位置 继承基类建立圆派生类,新增圆的半径继承基类建立圆派生类,新增圆的半径R属属性,定义求圆面积和周长的方法,并重写性,定义求圆面积和周长的方法,并重写Print方法用来输出圆心坐标、圆面积和周长方
17、法用来输出圆心坐标、圆面积和周长 将圆作为基类建立圆柱派生类,新增圆柱体将圆作为基类建立圆柱派生类,新增圆柱体的高度的高度Height这一属性,重写求面积方法,这一属性,重写求面积方法,改为求圆柱表面积,定义求体积的方法,重改为求圆柱表面积,定义求体积的方法,重写写Print方法用来输出圆柱体表面积和体积等方法用来输出圆柱体表面积和体积等 任务任务 5.3 5.3 根据圆的半径计算圆面积根据圆的半径计算圆面积定义基类定义基类 public class Centre protected int x,y; public Centre() public Centre(int myx,int myy)
18、 x = myx; y = myy; public virtual string Print() string str = 圆心坐标:圆心坐标:( + X.ToString() + , + Y.ToString() + ); return str; 构造函数构造函数虚拟方法虚拟方法 定义派生类定义派生类 public class Round:Centre /定义派生类定义派生类 private int r; public Round() public Round(int myx,int myy,int myr):base(myx ,myy ) r = myr; public override
19、string Print() string str = base.Print ()+rn+圆的面积:圆的面积:+Area ().ToString ()+rn+圆的周长:圆的周长:+Perimeter ().ToString (); return str; 方法覆盖方法覆盖从派生类中访问基类的属性和从派生类中访问基类的属性和方法成员方法成员 指导员工执行工作列表训练要点训练要点抽象类和抽象方法抽象类和抽象方法需求分析需求分析实现员工执行工作列表实现员工执行工作列表编码工作指标项:有效编码行数、遗留问题、工作日编码工作指标项:有效编码行数、遗留问题、工作日测试工作指标项:测试用例个数、发现的测试工
20、作指标项:测试用例个数、发现的Bug数、工作日数、工作日实现思路实现思路搭建窗体搭建窗体编写编写Job类类编写编写Job子类子类(TestJob、CodeJob),并实现抽象,并实现抽象Execute()方法方法实现右键实现右键“执行执行”响应事件响应事件完成时间:完成时间:25分钟分钟练习查看工作指标完成情况需求说明需求说明实现员工查看工作指标完成情况实现员工查看工作指标完成情况完成时间:完成时间:15分钟分钟总结实现面向对象的多态性有哪几种方法?实现面向对象的多态性有哪几种方法?抽象类可以被继承吗?抽象类可以被继承吗?抽象方法可以有方法体吗?抽象方法可以有方法体吗?简述抽象方法和虚方法的区别?简述抽象方法和虚方法的区别?