《NET构造函数.ppt》由会员分享,可在线阅读,更多相关《NET构造函数.ppt(51页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、预习检查构造函数何时执行?分别说明什么是封装、继承、多态?提问提问2/35本章任务完善SE类计算员工薪水使用OO模拟遥控器控制电视机的开、关和换台3/35本章目标理解并会编写类的构造函数理解封装的概念理解继承的概念熟练使用继承建立父类和子类理解多态的概念会重写虚方法实现多态4/35构造函数实例化一个程序员对象并问好static void Main(string args) SE engineer = new SE(); engineer.Age = 25; engineer.Name = 艾边成艾边成; engineer.Gender = Gender.male; engineer.ID =
2、112; engineer.Popularity = 100; Console.WriteLine(engineer.SayHi();public class SE public SE() 调用调用SE的的构造函数构造函数设置属性设置属性如果忘记赋值,如果忘记赋值,保持初始值保持初始值问题问题5/35编写无参构造函数构造函数是类中一种特殊的方法构造函数名与类名相同,不返回任何值,主要完成对象的初始化工作public class SE public SE() this.ID = 000; this.Age = 20; this.Name = 无名氏无名氏; (1)在构造函数中,可以给属)在构造函
3、数中,可以给属性设置默认值性设置默认值(2)this指代当前对象指代当前对象示例示例6/35编写带参构造函数不同对象实例化后,仍需设置不同属性值;能否实例化时一次性设置对象真正的属性值?带参数的构造函数public class SE public 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 = popularity; 将参数的值,将参数的
4、值,分别赋给当前实例的属性分别赋给当前实例的属性提问提问7/35使用构造函数构造函数 每次创建类的示例(new)时会被调用new 关键字 可以实例化一个新的对象 指定调用某个带参数的构造函数 SE engineer = new SE(112, 艾边成艾边成, 25, Gender.male, 100);SE engineer = new SE();指定实例化对象的属性值指定实例化对象的属性值 简化了对象属性初始化简化了对象属性初始化8/35常见错误Cat cat = new Cat(欢欢欢欢, 2, 波斯猫波斯猫);Console.WriteLine(cat.Name);public clas
5、s Cat public Cat(int age, string name, string brand) /省略省略 /省略字段、属性省略字段、属性编译错误编译错误 参数列表不对应参数列表不对应Cat cat = new Cat(2, 欢欢欢欢, 波斯猫波斯猫);提问提问创建cat对象的代码能否正确执行?调用带参构造函数一定要使调用带参构造函数一定要使传入的参数和参数列表对应传入的参数和参数列表对应9/35类的隐式构造函数构造两个程序员对象/实例化一个程序员对象实例化一个程序员对象SE engineer = new SE(112, 艾边成艾边成, 25, Gender.male, 100);/
6、实例化另一个程序员对象实例化另一个程序员对象SE joe = new joe();public class SE public SE (string id, string name, int age, Gender gender,int popularity)/省略省略 /省略字段、属性省略字段、属性编译错误:不包含采用编译错误:不包含采用“0”参数的构造函数参数的构造函数 每个类都默认有一个无参数的构造函数,一旦手动添加了构造函数,每个类都默认有一个无参数的构造函数,一旦手动添加了构造函数,系统就不会再给类添加无参构造函数系统就不会再给类添加无参构造函数示例示例注意注意10/35小结已有St
7、udent类,包含的属性 学号 姓名 年龄创建学生对象时,支持以下构造方式 构造时需提供姓名、年龄 学号设为默认值“0000”现场编程现场编程11/35封装是面向对象三大特征之一 一个不可分割的独立实体 隐藏内部的细节 保留对外接口通过访问修饰符授权12/49封装-类类是一个最基本的封装封装的好处 保证数据安全性 提供清晰的对外接口 类内部实现可以任意修改,不影响 其他类13/49复习-类和对象的关系类是一个概念 定义类对象是实体 创建对象class PM/省略成员省略成员PM pm=new PM();14/49private int _age; /年龄年龄public int Age /年龄
8、必须大于年龄必须大于30岁岁 get return _age; set if (value = 30 | value = 100) _age = value; else _age = 30; 复习-类的属性类的属性 可读写、只读、只写 设置验证逻辑class PM private string _name; /姓名姓名 public string Name get return _name; set _name = value; /省略其他属性省略其他属性get、set访问器保障类中字段的安全访问器保障类中字段的安全15/49自动属性快捷键适用场合 不对字段进行逻辑验证的操作/ 姓名姓名pub
9、lic string Name get; set; private string _name; /姓名姓名public string Name get return _name; set _name = value; 简化简化 编译器自动生成编译器自动生成Name的私有字段的私有字段 prop + tab键键 + tab键键语法语法16/49小结定义一个魔兽类,结构如图所示 属性均为可读写现场编程现场编程17/49对比两个类PM、SE加入CEO、CTO类,具有这些相同的属性代码冗余年龄、性别、姓名等是重复的年龄、性别、姓名等是重复的如何共用重复代码?如何共用重复代码?问题问题18/42提取冗余
10、代码将公共的成员放到一个类中将公共的成员放到一个类中保留自己特有的成员保留自己特有的成员保留自己特有的成员保留自己特有的成员分析分析19/42提取后的应用class SE:Employee public 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 =popularity; / 人气值人气值 public int Popularity g
11、et; set; 只有特有的属性只有特有的属性公共属性仍可访问公共属性仍可访问继承继承分析分析20/42卡车和巴士都是汽车,它们共有的特征来自汽车卡车和巴士都是汽车,它们共有的特征来自汽车 生活中的继承汽车汽车 有什么共同特征和行为呢?有什么共同特征和行为呢?卡车卡车 公共汽车公共汽车 21/42继承概述2-1继承: 在 C# 中,类可以继承自另一个类 衍生的类(子类)继承父类的方法和数据成员 子类继承父类,父类派生子类 父类又叫基类 子类又叫派生类Employee PM SE 子类子类 父类父类 class 子类子类 : 父类父类 语法语法22/42继承概述2-2继承是面向对象的一个重要特性
12、继承指出两个类符合“A 是 B”的关系继承在类图中的表示继承在类图中的表示自己特有的成员自己特有的成员继承父类的成员继承父类的成员继承需要符合的关系:继承需要符合的关系:is-a。如:。如:SE is a Employee23/42继承的实际应用3-1 部门所有人都自我介绍SayHi()SE 大家好,我是大家好,我是 XX, 今年今年 XX岁,工号是岁,工号是 XX,我的人气值高达,我的人气值高达 XX!PM 大家好,我是大家好,我是 XX ,今年,今年 XX岁,项目管理经验岁,项目管理经验 XX年。年。子类特有属性子类特有属性子类中访问继承父类的公共属性子类中访问继承父类的公共属性问题问题2
13、4/42继承的实际应用3-2SE类和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 = popularity;继承自父类的公共属性继承自父类的公共属性子类扩展的属性子类
14、扩展的属性实现继承实现继承分析分析25/42继承的实际应用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();/实例化一个实例化一个PM对象对象PM pm = new PM(890,盖茨盖茨,50,Gender.female,50);Co
15、nsole.WriteLine(pm.SayHi();SE调用自己的调用自己的SayHi() PM调用自己的调用自己的SayHi() 分析分析26/42base调用父类成员关键字base的作用 调用父类的属性和方法public string SayHi() string message = string.Format( 大家好,我是大家好,我是 0, 今年今年 1岁,工号是岁,工号是 2,我的人气值高达,我的人气值高达 3!, base.Name, base.Age, base.ID, this.Popularity); return message;调用父类的属性调用父类的属性调用自身的属性
16、调用自身的属性27/42protected访问修饰符如何让父类中的某个成员只允许其子类访问?protected访问修饰符只允许继承它的子类访问访问修饰符只允许继承它的子类访问 父类成员父类成员public修饰修饰子类继承并可以访问子类继承并可以访问private修饰修饰子类无法访问子类无法访问问题问题28/42构造子类对象,父类做了什么?base关键字:显式调用父类构造函数揭秘子类构造函数public SE(string id,string name,int age, Gender gender, int popularity) : base(id, age, name, gender) th
17、is.Popularity = popularity;显式调用父类的构造函数显式调用父类的构造函数公共属性在父类构造函数中初始化,公共属性在父类构造函数中初始化,代码简洁、冗余少代码简洁、冗余少public SE(string id, string name, int age, Gender gender,int popularity) this.ID = id; . this.Popularity = popularity;base()隐式调用父类构造函数隐式调用父类构造函数问题问题29/42常见错误2-1public PM(string id,string name,int age, Ge
18、nder gender, int yearOfExperience): base(string id,int age, string name,Gender gender) this.YearOfExperience = yearOfExperience;调用父类构造函数传递参数,调用父类构造函数传递参数,不需再次指定参数的数据类型不需再次指定参数的数据类型编译错误编译错误代码阅读代码阅读public PM(string id,string name,int age, Gender gender, int yearOfExperience): base(id,nianLing, xingMin
19、g, gender) this.YearOfExperience = yearOfExperience;调用父类构造函数传递参数,调用父类构造函数传递参数,参数的变量名必须与父类构参数的变量名必须与父类构造函数中的参数名一致造函数中的参数名一致编译错误编译错误30/42常见错误2-2class Person public Person(int age, string name) this.Age = age; this.Name = name; /省略属性代码省略属性代码class Student:Person public Student(int age, string name, stri
20、ng hobby) this.Age = age; this.Name = name; this.Hobby = hobby; 父类要提供无参的构造函数父类要提供无参的构造函数如果父类没有无参的构造函数如果父类没有无参的构造函数子类构造函数必须指明调用父类哪个构造函数子类构造函数必须指明调用父类哪个构造函数代码阅读代码阅读31/42学员操作模拟汽车行驶2-1训练要点 继承 base关键字需求说明 编写控制台程序实现汽车与卡车的继承 汽车类Vehicle有VehicleRun()方法, 输出“汽车在行驶!” 卡车类Truck有TruckRun()方法,输出“型号为XX、产地为XX的卡车在行驶!”
21、 实例化一个卡车调用汽车和卡车的方法指导指导32/42学员操作模拟汽车行驶2-2实现思路 创建Vehicle类,并添加属性“类型”和“产地”以及构造函数 给Vehicle类添加方法VehicleRun() 创建Truck类继承Vehicle,添加构造函数 给Truck类添加方法TruckRun() 编写测试方法指导指导33/42继承的传递性汽车汽车双层双层 单层单层 小型卡车小型卡车 重型卡车重型卡车 同样具有汽车的特征同样具有汽车的特征继承的传递性继承的传递性卡车卡车公共汽车公共汽车还可以派生更多的类型还可以派生更多的类型34/42继承的传递性添加一个微型卡车类public class Sm
22、allTruck : Truck public void SmallTruckRun() Console.WriteLine(微型卡车在行驶!微型卡车在行驶!); static void Main(string args) SmallTruck smalltruck = new SmallTruck(); smalltruck.VehicleRun(); smalltruck.TruckRun(); smalltruck.SmallTruckRun(); public class Truck : Vehicle继承关系继承关系父类的父类成员父类的父类成员父类的成员父类的成员传递性传递性35/4
23、2继承的单根性public class CharmingPerson : SE, MusicianC#中中子类不能继承多个父类子类不能继承多个父类CharmingPerson 软件工程师(软件工程师(SE) 音乐家(音乐家(Musician) 某类人(某类人(CharmingPerson)既有软件工程师()既有软件工程师(SE)的天赋,)的天赋,也有音乐家(也有音乐家(Musician)的气质。是否可以用以下代码来描述?)的气质。是否可以用以下代码来描述?问题问题36/42巧妙减少判断冗余修改Employee类,添加SayHi()虚方法修改子类,重写父类SayHi()方法去除子类类型判断pub
24、lic virtual string SayHi() string message = string.Format(大家好!大家好!); return message;用用virtual关键字修饰关键字修饰 foreach(Employee empl in empls) Console.WriteLine( empl.SayHi() ); public override string SayHi() 用用override关键字修饰关键字修饰 这种方式实现了面向对象的这种方式实现了面向对象的多态多态 简化了代码维护简化了代码维护 分析分析37/42虚方法及方法重写虚方法方法重写访问修饰符访问修饰
25、符 virtual 返回值类型返回值类型 方法名方法名() /方法体方法体访问修饰符访问修饰符 override 返回值类型返回值类型 方法名方法名() /方法体方法体父类中定义的虚方法并非必须被子类重写。在父类中可给出父类中定义的虚方法并非必须被子类重写。在父类中可给出虚方法的默认实现。如果子类不重写父类的虚方法,依然执虚方法的默认实现。如果子类不重写父类的虚方法,依然执行父类的默认实现;反之,则执行子类重写后的方法行父类的默认实现;反之,则执行子类重写后的方法语法语法语法语法注意注意38/42生活中的多态听到听到“Cut!”他们会做什么?他们会做什么?剪断头发剪断头发切开皮肤切开皮肤停止表
26、演停止表演不同对象对于同一个方法(不同对象对于同一个方法(Cut)实现不同的行为)实现不同的行为 理发师理发师 外科医生外科医生 演员演员 39/42什么是多态多态: “多种形态”指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果同一个类在不同场合下表现出不同的行为特征PM对象和对象和SE对象对象SayHi()的内容不同的内容不同 Employee SE PM 方法重载也是实现多态性的一种方式。只不过重载的方法都在同方法重载也是实现多态性的一种方式。只不过重载的方法都在同一个类中,而用虚方法实现多态的方法分散在有继承关系的多个一个类中,而用虚方法实现多态的方法分散在有继承关系的多
27、个类中类中经验经验40/42重写虚方法实现多态2-1方法重写public class Employee public virtual string SayHi() string message = string.Format(大家好!大家好!); return message; public class SE:Employee public override string SayHi() 方法名、参数列表、返回值一样,提供不同的实现方法名、参数列表、返回值一样,提供不同的实现实现步骤实现步骤41/42重写虚方法实现多态2-2方法调用 或Employee ema = new SE(210,Ema
28、,33,Gender.female,100);Console.WriteLine(ema.SayHi();foreach(Employee empl in empls) Console.WriteLine(empl.SayHi(); 定义父类变量,创建子类对象。根据实际创建的对象类型,决定执行定义父类变量,创建子类对象。根据实际创建的对象类型,决定执行哪个方法。呈现多态性!哪个方法。呈现多态性!实现步骤实现步骤42/42学员操作多态实现工作汇报需求说明 修改前一个“学员操作实现工作汇报”的代码,去除冗余的判断,实现不同类型员工汇报工作练习练习43/42共性问题集中讲解常见问题及解决办法代码规范
29、问题调试技巧44/42学员操作多态实现计算器2-1训练要点 理解多态 正确使用虚方法实现多态需求说明 使用多态实现计算器指导指导45/42学员操作多态实现计算器2-2实现思路 创建父类Operation 属性NumberA和NumberB 虚方法GetResult() 依次创建子类OpeartionAdd等,继承父类并重写虚方法GetResult() 实现计算响应事件 根据不同运算符,创建不同子类对象 初始化运算数并执行计算指导指导46/42共性问题集中讲解常见问题及解决办法代码规范问题调试技巧47/35总结构造函数通常与类名相同,它不声明返回值一般情况下,构造函数是public 类型的被继承的类称为父类或者基类,继承其他类的类称为子类或者派生类base关键字可以用于调用父类的属性、方法和构造函数继承具有传递性和单根性多态指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果可以使用虚方法实现多态48/35作业课后作业 教员备课时根据班级情况在此添加内容,应区分必做、选做内容,以满足不同层次学员的需求预习作业 预习目标 预习下一章学生用书,完成预习作业49/3550/35
限制150内