版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章初识继承和多态初识继承和多态回顾与作业点评回顾与作业点评 使用使用new实例化对象时,调用了什么?实例化对象时,调用了什么? 说出方法重载的几个特点?说出方法重载的几个特点?预习检查预习检查 子类中调用父类成员的关键字是什么?子类中调用父类成员的关键字是什么? 重写父类方法使用什么关键字?重写父类方法使用什么关键字?本章任务本章任务 使用继承和多态使用继承和多态 实现模拟汽车行驶实现模拟汽车行驶 实现员工汇报工作实现员工汇报工作 实现计算器实现计算器 理解继承的概念理解继承的概念 能够利用继承建立父类和子类能够利用继承建立父类和子类 理解多态的概念理解多态的概念 会重写虚方法实现多态会重
2、写虚方法实现多态本章目标本章目标代码冗余代码冗余 对比两个类对比两个类PM、SE 加入加入CEO类,具有这些相同的属性类,具有这些相同的属性年龄、性别、姓年龄、性别、姓名等是重复的名等是重复的如何共用重复代码?如何共用重复代码?提取冗余代码提取冗余代码将公共的成员放将公共的成员放到一个类中到一个类中保留自己特有保留自己特有的成员的成员保留自己特有保留自己特有的成员的成员提取后的应用提取后的应用class SE:Employee public SE(string id, string name, int age, Gender gender,int popularity) this.ID = i
3、d; this.Name = name; this.Age = age; this.Gender = gender; this.Popularity = popularity; / 人气值人气值 public int Popularity get; set; .只有特有的属性只有特有的属性公共属性仍可访问公共属性仍可访问继承继承卡车和巴士都是汽车卡车和巴士都是汽车 生活中的继承生活中的继承汽车汽车 刹车刹车行驶行驶共有行为:共有行为:轮子轮子发动机发动机共有特征:共有特征:卸货卸货拉货拉货各自行为:各自行为:载重载重货舱货舱各自特征:各自特征:停靠站停靠站报站报站各自行为:各自行为:载客量载客
4、量客舱客舱各自特征:各自特征:他们共有的特征他们共有的特征来自汽车来自汽车有什么共同有什么共同特征呢?特征呢?卡车卡车 公共汽车公共汽车 继承概述继承概述2-1 继承:继承: 在在 C# 中,类可以继承自另一个类。衍生的类(子类)继承父中,类可以继承自另一个类。衍生的类(子类)继承父类的方法和数据成员类的方法和数据成员 子类继承父类,父类派生子类子类继承父类,父类派生子类 父类又叫父类又叫基类基类 子类又叫子类又叫派生类派生类Employee PM SE 子类子类 父类父类 class 子类子类 : 父类父类 继承概述继承概述2-2 继承是面向对象的一个重要特性继承是面向对象的一个重要特性 继
5、承指出两个类是继承指出两个类是“A 是是 B”关系关系继承在类图中继承在类图中的表示的表示自己特有的自己特有的成员成员继承父继承父类的成类的成员员继承需要符合的关系:继承需要符合的关系:is-aSE is a Employee继承的实际应用继承的实际应用3-1部门所有人都自我介绍部门所有人都自我介绍SayHi()SE 大家好,我是大家好,我是 XX, 今年今年 XX岁,工号是岁,工号是 XX,我的人气值高达,我的人气值高达 XX!PM 大家好,我是大家好,我是 XX ,今年,今年 XX岁,项目管理经验岁,项目管理经验 XX年。年。子类特有属性子类特有属性子类中访问继承父类子类中访问继承父类的公
6、共属性的公共属性继承的实际应用继承的实际应用3-2 SE类和类和PM类都继承类都继承Employee父类父类 子类构造函数设置公共属性和特有属性子类构造函数设置公共属性和特有属性public class PM:Employeepublic class SE:Employeepublic SE(string id, string name, int age, Gender gender,int popularity) this.ID = id; this.Name = name; this.Age = age; this.Gender = gender; this.Popularity = po
7、pularity;继承自父类的公共属性继承自父类的公共属性子类扩展的属性子类扩展的属性实现继承实现继承继承的实际应用继承的实际应用3-3 子类特有的子类特有的SayHi()方法方法 实例化对象调用实例化对象调用SayHi()public string SayHi() /SE的的SayHipublic string SayHi() /PM的的SayHi/实例化一个程序员对象实例化一个程序员对象SE engineer = new SE(112, 艾边成艾边成, 25, Gender.male, 100);Console.WriteLine(engineer.SayHi();/实例化一个实例化一个P
8、M对象对象PM pm = new PM(890,盖茨盖茨,50,Gender.female,50);Console.WriteLine(pm.SayHi();SE调用自己的调用自己的SayHi() PM调用自己的调用自己的SayHi() 演示示例:使用继承实现问好演示示例:使用继承实现问好base调用父类成员调用父类成员 关键字关键字base的作用的作用 调用父类的属性和方法调用父类的属性和方法public string SayHi() string message = string.Format( 大家好,我是大家好,我是 0, 今年今年 1岁,工号是岁,工号是 2,我的人气值高达,我的人气
9、值高达 3!, base.Name, base.Age, base.ID, this.Popularity); return message;调用父类的调用父类的属性属性protected访问修饰符访问修饰符 如何让父类中的某个成员只允许其子类访问如何让父类中的某个成员只允许其子类访问protected访问修饰符只允许继承它的子类访问访问修饰符只允许继承它的子类访问 父类成员父类成员public修饰修饰子类继承并可子类继承并可以访问以访问private修饰修饰子类无法访问子类无法访问演示示例:演示示例:protected访问修饰符访问修饰符类内部类内部子类子类其他类其他类public可以可以可
10、以可以可以可以private可以可以不可以不可以不可以不可以protected可以可以可以可以不可以不可以揭秘子类构造函数揭秘子类构造函数 构造子类对象,父类做了什么?构造子类对象,父类做了什么? base关键字:显示调用父类构造函数关键字:显示调用父类构造函数演示示例:断点追踪实例化对象过程演示示例:断点追踪实例化对象过程public SE(string id,string name,int age, Gender gender, int popularity) : base(id, age, name, gender) this.Popularity = popularity;显示调用父类
11、的显示调用父类的构造函数构造函数公共属性在父类构造函数中初始化,公共属性在父类构造函数中初始化,代码简洁、冗余少代码简洁、冗余少演示示例:使用演示示例:使用base指定调用父类构造函数指定调用父类构造函数public SE(string id, string name, int age, Gender gender,int popularity) this.ID = id; . this.Popularity = popularity;base()隐式调用父隐式调用父类构造函数类构造函数常见错误常见错误2-1class Student:Person public Student(int age
12、, string name, string hobby) :base(int age, string name) this.Hobby = hobby; 调用父类构造函调用父类构造函数:传递参数数:传递参数编译错误编译错误常见错误常见错误2-2class Person public Person(int age, string name) this.Age = age; this.Name = name; public int Age get; set; public string Name get; set; class Student:Person public Student(int a
13、ge, string name, string hobby) this.Age = age; this.Name = name; this.Hobby = hobby; base()父类要提供无参的构父类要提供无参的构造函数造函数如果父类没有无参的构造函数如果父类没有无参的构造函数子类构造函数必须指明调用父类哪个构造函数子类构造函数必须指明调用父类哪个构造函数指导指导模拟汽车行驶模拟汽车行驶 训练要点训练要点 继承继承 base关键字关键字 需求说明需求说明 控制台程序实现汽车与卡车的继承控制台程序实现汽车与卡车的继承 汽车类汽车类Vehicle有有VehicleRun ()方法,方法, 输出
14、输出“汽车在行驶!汽车在行驶!” 卡车类卡车类Truck有有TruckRun()方法,输出方法,输出“型号为型号为XX、产地为、产地为XX的的卡车在行驶!卡车在行驶!” 实例化一个卡车调用汽车和卡车的方法实例化一个卡车调用汽车和卡车的方法指导指导模拟汽车行驶模拟汽车行驶 实现思路实现思路 创建创建Vehicle,并添加属性,并添加属性“类型类型”和和“产地产地”以及构造函数以及构造函数 Vehicle类添加方法类添加方法VehicleRun() 创建创建Truck类继承类继承Vehicle,添加构造函数,添加构造函数 Truck类添加方法类添加方法TruckRun() 编写测试方法编写测试方法
15、完成时间:完成时间:15分钟分钟继承的传递性继承的传递性汽车汽车双层双层 单层单层 小型卡车小型卡车 重型卡车重型卡车 同样具有汽车同样具有汽车的特征的特征继承的传递性继承的传递性卡车卡车公共汽车公共汽车还可以派生还可以派生更多的类型更多的类型继承的传递性继承的传递性 添加一个微型卡车类添加一个微型卡车类public class SmallTruck : Truck public void SmallTruckRun() Console.WriteLine(微型卡车在行驶!微型卡车在行驶!); static void Main(string args) SmallTruck smalltruc
16、k = new SmallTruck(); smalltruck.VehicleRun(); smalltruck.TruckRun(); smalltruck.SmallTruckRun(); public class Truck : Vehicle继承关系继承关系父类的父类成员父类的父类成员父类的成员父类的成员传递性传递性继承单根性继承单根性public class CharmingPerson : SE, Musician编译错误编译错误C#中子类不能继承多个父类中子类不能继承多个父类CharmingPerson 软件工程师软件工程师 音乐家音乐家 某类人某类人是否可以这样是否可以这样描
17、述?描述?具有两种人的具有两种人的特征特征软件开发中继承的妙处软件开发中继承的妙处 模拟现实世界的关系模拟现实世界的关系 便于重用和扩展已彻底测试的代码,且无需修改便于重用和扩展已彻底测试的代码,且无需修改 结构更清晰结构更清晰SE人气值人气值Employee姓名姓名年龄年龄子类更加关注与子类子类更加关注与子类相关的行为和状态相关的行为和状态共有属性由父类负责共有属性由父类负责IS-A的应用的应用 实现多个员工逐个问好(包括实现多个员工逐个问好(包括SE和和PM)子类子类 is-a 父类,子类可以加入父类类型的父类,子类可以加入父类类型的泛型集合泛型集合ListSE ai = new SE(1
18、12, 艾边成艾边成, 25, Gender.male, 100);List empls = new List();empls.Add(ai);if (empls0 is SE) SE se = (SE)empls0; Console.WriteLine(se.SayHi();演示示例:演示示例:is a的应用的应用is检查类型检查类型指导指导实现工作汇报实现工作汇报 训练要点训练要点 继承继承 构造函数构造函数 IS-A 需求说明需求说明 PM类和类和SE类均继承类均继承Employee,公共属性在父类构造函数中,公共属性在父类构造函数中初始化初始化 实现不同员工汇报工作方法实现不同员工汇报
19、工作方法DoWork() SE通过遍历工作项,输出工作信息通过遍历工作项,输出工作信息 PM输出固定工作信息输出固定工作信息指导指导实现工作汇报实现工作汇报 难点分析难点分析 Job类定义工作项类定义工作项 SE和和PM继承员工类继承员工类 DoWork()方法是子类特有方法是子类特有的方法的方法完成时间:完成时间:25分钟分钟扩展的麻烦扩展的麻烦 添加对象后遍历泛型集合添加对象后遍历泛型集合List empls = new List();foreach(Employee empl in empls) if (empl is SE) Console.WriteLine(SE)empl).Say
20、Hi(); if(empl is PM) Console.WriteLine(PM)empl).SayHi(); 进行判断对象类进行判断对象类型型调用相应类的调用相应类的SayHi()添加多个不同的子类,添加多个不同的子类,SayHi()都不同都不同, ,增加代码复杂度如何解决?增加代码复杂度如何解决? 巧妙减少判断冗余巧妙减少判断冗余 修改修改Employee类类 修改子类修改子类SayHi()方法方法 去除子类类型判断去除子类类型判断public virtual string SayHi() string message = string.Format(大家好!大家好!); return
21、message;添加添加SayHi()方法方法 用关键字修饰用关键字修饰 foreach(Employee empl in empls) Console.WriteLine(empl.SayHi(); public override string SayHi() 用关键字修饰用关键字修饰 这种方式实现了面向对象的这种方式实现了面向对象的多态多态 简化了代码维护简化了代码维护 生活中的多态生活中的多态Cut.!听到这个声音他们听到这个声音他们会做什么?会做什么?剪断头发剪断头发切开皮肤切开皮肤停止表演停止表演不同对象对于同一个方法(不同对象对于同一个方法(Cut)实现不同的行为)实现不同的行为
22、理发师理发师 外科医生外科医生 演员演员 什么是多态什么是多态 多态:指两个或多个属于不同类的对象,对同一个消息多态:指两个或多个属于不同类的对象,对同一个消息(方法调用)作出不同响应的能力(方法调用)作出不同响应的能力 同一个类在不同场合下表现出不同的行为特征同一个类在不同场合下表现出不同的行为特征PM对象和对象和SE对象对象SayHi()的内容不同的内容不同 Employee SE PM Employee类,类,在这两种场合的在这两种场合的行为不同行为不同重写虚方法实现多态重写虚方法实现多态2-1方法重写方法重写:子类重写父类方法:子类重写父类方法public class Employee
23、 public virtual string SayHi() string message = string.Format(大家好!大家好!); return message; public class SE:Employee public override string SayHi() 重写重写方法名、参数列表、返回值方法名、参数列表、返回值一样,提供不同的实现一样,提供不同的实现virtual关键字表关键字表示虚方法示虚方法override关键字关键字实现方法重写实现方法重写1重写虚方法实现多态重写虚方法实现多态2-2方法调用:方法调用:2Employee ema = new SE(210,Ema,33,Gender.female,100);Console.WriteLine(ema.SayHi();定义父类变量,定义父类变量,创建子类对象创建子类对象foreach(Employee empl in empls) Console.Wri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物基高吸水性凝胶的制备与性能研究
- 2025年度房地产开发项目土地使用权抵押融资协议
- Z银行Y分行客户经理绩效管理优化研究
- 二零二五年度子女抚养权争议调解及财产分配协议
- 二零二五年度海洋生物专利许可使用合同
- 2025年度驾驶员安全责任协议书与车辆保险合作协议
- 二零二五年度美容院顾客美容套餐优惠协议
- 二零二五年度电子票据处理电子版买卖合同
- 二零二五年度商业街物业管理与服务协议
- 2025年度二零二五年度知识产权运营管理代理协议
- GB/T 45120-2024道路车辆48 V供电电压电气要求及试验
- 春节文化常识单选题100道及答案
- 12123交管学法减分考试题及答案
- 2025年寒假实践特色作业设计模板
- 24年追觅在线测评28题及答案
- 初中物理八年级下册《动能和势能》教学课件
- 高考满分作文常见结构
- 心肌梗死诊疗指南
- 食堂项目组织架构图
- 原油脱硫技术
- GB/T 2518-2019连续热镀锌和锌合金镀层钢板及钢带
评论
0/150
提交评论