《第09讲 多态.ppt》由会员分享,可在线阅读,更多相关《第09讲 多态.ppt(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、武汉科技大学城市学院武汉科技大学城市学院SqlServer2005 C#程序设计程序设计第第08讲讲 多态多态余正红余正红理解多态的概念理解多态的概念理解抽象方法和抽象类理解抽象方法和抽象类了解简单工厂设计模式的应用了解简单工厂设计模式的应用理解虚方法与抽象方法的区别理解虚方法与抽象方法的区别本章目标本章目标回顾继承回顾继承Person类类老师老师 学员学员 SayHi()SayHi()继承继承 List SayHi()遍历遍历List,循环,循环SayHi()内容不同内容不同将所有人都存入集合将所有人都存入集合调用两种类型的调用两种类型的SayHi方法方法扩展的麻烦扩展的麻烦for(int
2、i=0;i person.Count;i+)if(personi is Student)(Student)personi).StuSayHi();else if(personi is Teacher)(Teacher)personi).TeachSayHi();进行判断对象类进行判断对象类型型调用相应类的调用相应类的SayHi()添加多个不同的子类,添加多个不同的子类,SayHi都不同增加代码复杂度如何解决?都不同增加代码复杂度如何解决?添加对象后遍历泛型集合添加对象后遍历泛型集合巧妙的做法巧妙的做法abstract class Person public abstract void SayH
3、i();for(int i=0;i person.Count;i+)personi.SayHi();这种方式实现了面向对象的这种方式实现了面向对象的多态多态 修改修改Person类类添加一个未实现的方法添加一个未实现的方法 用关键字修饰用关键字修饰 演示示例演示示例1 MySchool 去除子类类型判断去除子类类型判断生活中的多态生活中的多态Cut.!听到这个声音他们听到这个声音他们会做什么?会做什么?剪断头发剪断头发切开皮肤切开皮肤停止表演停止表演不同对象对于同一个方法(不同对象对于同一个方法(Cut)调用的不同行为。)调用的不同行为。理发师理发师 外科医生外科医生 演员演员 什么是多态什么
4、是多态指不同对象收到相同消息时,会产生不同行为指不同对象收到相同消息时,会产生不同行为Student和和Teacher类类SayHi的内容不同的内容不同 同一个类在不同的场合下表现出不同的行为特征同一个类在不同的场合下表现出不同的行为特征Person Student Teacher Person类,在类,在这两种场合的这两种场合的行为不同行为不同抽象类和抽象方法抽象类和抽象方法abstract class Person public abstract void SayHi();抽象方法抽象方法 一个没有实一个没有实现的方法现的方法有抽象方法的类必然是抽象类有抽象方法的类必然是抽象类抽象类用来列
5、举一个类所需要的行为抽象类用来列举一个类所需要的行为抽象类不明确提供具体实现方法抽象类不明确提供具体实现方法抽象类必须由其子类实现它的抽象方法(除非子类也具抽象类必须由其子类实现它的抽象方法(除非子类也具有抽象性)有抽象性)常见错误常见错误抽象类不能被实例化抽象类不能被实例化抽象类不能是密封或静态的抽象类不能是密封或静态的Person person=new Person();编译错误编译错误抽象类不能用抽象类不能用sealed和和static修饰修饰实现抽象方法实现抽象方法使用使用override实现抽象方法实现抽象方法public override void SayHi()/具体实现内容具体
6、实现内容重写重写 实现抽象方法实现抽象方法演示示例演示示例2 MySchool 抽象类实际应用抽象类实际应用if(pm.Profile.Feedsnode.Index is AtomFeed)atomFeed=(AtomFeed)pm.Profile.Feedsnode.Index;if(atomFeed.FetchArticles()UpdateArticlesView(node.Index);扩展会增加复杂度,扩展会增加复杂度,如何去除类型判断?如何去除类型判断?去掉获取文章列表功能中的子类类型判断去掉获取文章列表功能中的子类类型判断1 1、通过面向对象的多态性,将父类设为抽象类、通过面向
7、对象的多态性,将父类设为抽象类2 2、在抽象父类中添加一个抽象方法、在抽象父类中添加一个抽象方法abstract FetchArticles3 3、在不同类型的、在不同类型的Feed子类中重写子类中重写FetchArticles演示示例演示示例3 MyNewsReader 类型判断类型判断 Dog:Animal Cat:Animal 抽象类的应用场合抽象类的应用场合abstract Animal 抽象类和抽象方法实现多态性抽象类和抽象方法实现多态性父类提供一系列规定父类提供一系列规定,约束子类的行为约束子类的行为父类可以提供一些共性的行为父类可以提供一些共性的行为猫咪喵喵叫猫咪喵喵叫 狗狗汪汪
8、叫狗狗汪汪叫 abstract 叫叫()是动物就要会叫是动物就要会叫 里氏替换原则里氏替换原则/Student stu1=new Student();Student stu2=new Student();List person=new List();person.Add(stu1);person.Add(stu2);/子类对象可以替换父类子类对象可以替换父类里氏替换原则(里氏替换原则(LSP)子类的对象能够替换其父类子类的对象能够替换其父类父类对象不能够替换子类父类对象不能够替换子类父类的方法都要在子类中实现或者重写父类的方法都要在子类中实现或者重写is与与as操作符操作符is 检查对象是否与
9、指定类型兼容检查对象是否与指定类型兼容if(personi is Student)判断判断person集合的元素是集合的元素是否是否是Student对象对象as 用于在兼容的引用类型之间执行转换用于在兼容的引用类型之间执行转换 for(int i=0;i Students.Count;i+)Student stu=Studentsi as Student;Console.WriteLine(stu.Name);转换失败返回值为空转换失败返回值为空一种类型转换方式一种类型转换方式小结小结利用多态性编写这三种职业听到利用多态性编写这三种职业听到“cut”时的行为时的行为为什么需要虚方法为什么需要虚
10、方法大家好,我是某某先生(女士),今年多少岁大家好,我是某某先生(女士),今年多少岁抽象方法不能在抽象方法不能在父类实现父类实现学员学员 大家好,我是某某同学,今年多少岁,喜欢什么大家好,我是某某同学,今年多少岁,喜欢什么老师老师 大家好,我是某某老师,今年多少岁,工作几年了大家好,我是某某老师,今年多少岁,工作几年了提供一个通用的方式提供一个通用的方式 继续完善继续完善MySchool学员和老师也可以使用通用方式学员和老师也可以使用通用方式默认默认SayHi能否写在能否写在Person类中?类中?各子类可以重写不同行为各子类可以重写不同行为SayHi。可以使用虚方法实现可以使用虚方法实现 使
11、用虚方法使用虚方法/person类中默认实现通用的类中默认实现通用的SayHipublic virtual void SayHi()/省略具体实现省略具体实现虚方法虚方法 演示示例演示示例4 MySchool 用默认的用默认的SayHi的对象,子类中不需要重写的对象,子类中不需要重写SayHi用自己的用自己的SayHi子类中要重写子类中要重写SayHi同样使用同样使用override重写重写回顾第四章常见错误回顾第四章常见错误Student scofield=new Student(Scofield,Genders.Male,28,越狱狱越狱狱);Student stu2=new Studen
12、t(Scofield,Genders.Male,28,越狱狱越狱狱);/打印集合数目打印集合数目Students.Remove(stu2);/打印集合数目打印集合数目定义一个值相同的对象定义一个值相同的对象 结果没有删除,为什么?结果没有删除,为什么?类的类的Equals方法,默认支持引用相等方法,默认支持引用相等scofield和和stu2不是同一个引用不是同一个引用可以重写可以重写Equals方法支持值相等方法支持值相等public override bool Equals(object obj)/将要比较的对象转换为当前类型将要比较的对象转换为当前类型 Student target=ob
13、j as Student;/如果为空、类型不同如果为空、类型不同 if(target=null)return false;if(target.name=this.name&target.gender=this.gender&target.age=this.age&target.hobby=this.hobby&target.popularity=this.popularity)return true;return false;重写重写Equals判断对象中的判断对象中的每一个属性值每一个属性值是否都相等是否都相等 public virtual void Equals(Object obj)Eq
14、uals是虚方法是虚方法 重写这个虚方法重写这个虚方法 演示示例演示示例5 重写重写Equals 只能在抽象类中只能在抽象类中除了密封类都可以写除了密封类都可以写必须被子类必须被子类 override可以被子类可以被子类 override不允许有方法体不允许有方法体要有方法体,哪怕是一个分号要有方法体,哪怕是一个分号用用 abstract 修饰修饰用用 virtual 修饰修饰抽象方法抽象方法虚方法虚方法虚方法与抽象方法虚方法与抽象方法面向对象的三大特性面向对象的三大特性隐藏内部实现,稳定外部接口隐藏内部实现,稳定外部接口 封装封装继承继承子类继承父类成员,实现代码复用子类继承父类成员,实现代码复用 多态多态不同子类对同一个消息作出不同的反映不同子类对同一个消息作出不同的反映