首页 C#3.0教程ppt\第5章 父子关系—继承

C#3.0教程ppt\第5章 父子关系—继承

举报
开通vip

C#3.0教程ppt\第5章 父子关系—继承第5章父子关系—继承前面已经学习了.NET中的很多类和对象,已经可以应用面向对象的思想去思考问题和编写程序了。在实际问题中,有很多类和对象之间是有交叉关系的,就像我们每一个人都有很多社会关系一样,父子、兄弟、姐妹等。这一章主要学习C#编程中非常重要的概念:继承,这个概念也是面向对象编程中最重要的内容。通过本章的学习,能够利用继承的强大机制,简洁高效的用C#语言描述类之间的关系,实现代码重用。面向对象的继承由很多技术来实现,包括:基类、类、抽象类、接口、多态、模式等。前边学过的方法重载就是多态的表现。这一章主要理解继...

C#3.0教程ppt\第5章  父子关系—继承
第5章父子关系—继承前面已经学习了.NET中的很多类和对象,已经可以应用面向对象的思想去思考问题和编写程序了。在实际问题中,有很多类和对象之间是有交叉关系的,就像我们每一个人都有很多社会关系一样,父子、兄弟、姐妹等。这一章主要学习C#编程中非常重要的概念:继承,这个概念也是面向对象编程中最重要的内容。通过本章的学习,能够利用继承的强大机制,简洁高效的用C#语言描述类之间的关系,实现代码重用。面向对象的继承由很多技术来实现,包括:基类、类、抽象类、接口、多态、模式等。前边学过的方法重载就是多态的表现。这一章主要理解继承的概念,掌握C#中实现继承的机制。主要内容为:继承的概念和如何使用继承如何实现方法重写抽象类和抽象方法接口及其相关技术5.1继承概述本节首先介绍继承的基本概念,理解继承的特点和使用价值,掌握类之间如何实现继承,加深面向对象思想的理解,体会面向对象思想在编程中的具体实现。5.1.1什么是继承在我们的日常生活中,相信大家都能够理解类的概念,例如:动物和植物两大类,这两大类又可以进一步细分为很多子类,狗、猫、老虎、大象、狮子等,分别属于不同的类别,但它们共同都属于动物这个大类,都拥有动物共同的特性,同时又具有各自的特点。为了能够合理描述自然界的这些规律,面向对象的编程中引入了继承的概念,它是面向对象编程中最重要的概念之一,定义了如何根据现有类创建新类的过程。任何类都可以从另外一个类继承,遵循的原则是:一个类派生出来的子类具有这个类所有的公共属性和方法。例如:从哺乳动物这个类派生出来的所有子类猫、狗、老虎等都具有一个鼻子,两只眼睛等公共属性,同时,这些子类猫、狗等各自都有自身的特点。C#提供了类的继承机制,创建新类所根据的基础类称为基类或父类,新建的类则称为派生类或子类。在面向对象的编程中,继承遵循代码重用的原则,使用继承可以不需要从头开始创建新类,可以在现有的基础上添加新的方法和属性,节约时间和精力,大大提高了效率。5.1.2继承的使用【本节示例参考:\源代码\C5\MySchool】现在有一个学校管理系统的项目,此项目中至少包含老师和学生两个角色,他们有共同的字段:姓名、年龄、性别,都要从控制台输入字段值,为了实现这个功能,分别为每一个类添加Accept()方法,除此之外,老师和学生各自都有自己独有的行为。通过分析,我们创建了MySchool控制台应用程序,包含两个类:Student类和Teacher类,具体代码在这而不作详细解释,可以通过下面的类图对比一下两个类的结构,如图5.2所示。通过类图可以看出,在Teacher和Student类中,有一些相同的属性:年龄(age)、姓名(name)、性别(gender),也有一个相同的方法Accept(),说明这两个类中有一些代码是相同的,这些相同的代码就产生了代码冗余,在程序编写过程中有大量重复代码是不可取的,也会降低编码效率。这就产生了一个问题:【问题:如何避免代码冗余,提高编码效率呢?】方法分析:(1)创建一个新的类Person,具有Teacher和Student类中公共部分;(2)删除Teacher和Student类中提取出去的代码,保留各自独有的部分;(3)实现继承,父类为Person,子类为Teacher和Student。5.1.3继承的特性【本节示例参考:\源代码\C5\Example_MySchool】从上面的例子中可以看出,C#中的继承和其他面向对象的语言有很多相同之处,主要有下面的特性:1.继承的传递性2.继承的单一性继承的单一性是指子类只能继承一个父类,不能同时继承多个父类。C#不支持多重继承,也就是说儿子只能有一个亲生父亲,不能同时拥有多个亲生父亲。C#中使用接口技术实现多重继承,这个在后面的章节中会具体阐述。5.1.4访问修饰符——设置访问权限前面的内容中我们讲到访问修饰符,相信大家已经有了基本的概念,那么在继承时各个访问修饰符有什么不同呢?表5.1说明了它们之间的区别。父类中的成员如果用public修饰,任何类都可以访问;如果用private修饰,它将作为私有成员,只有类本身可以访问,其他任何类都无法访问。在C#中,我们使用protected修饰符,使用这个访问修饰符的成员可以被其子类访问,而不允许其他非子类访问。从上面的表中可以看出,父类中只有被“public”、“protected”、“internal”修饰的成员才可以被继承,这些成员包括任何父类的字段、属性、方法和索引器,但是父类的构造函数和析构函数是不能被子类继承的。如果要继承父类的构造函数,必须使用base关键字来实现。5.1.5base关键字——调用父类成员【本节示例参考:\源代码\C5\Example_BaseTest】C#中base关键字在继承中起到非常重要的作用,它可以和this关键字相比较,大家都知道this代表当前实例,那么base关键字代表父类,使用base关键字可以调用父类的构造函数、属性和方法。使用base关键字调用父类构造函数的语法如下:子类构造函数:base(参数列表)使用base关键字调用父类方法的语法如下:base:父类方法();代码5-4演示如何使用base调用父类构造函数和方法。5.1.6this关键字——调用本类成员【本节示例参考:\源代码\C5\Example_ThisTest】前面我们编写代码时常用到this关键字,使用this关键字可以使代码编写简单,不容易出错。在类的方法里输入this关键字,在后面输入一个“.”符号后,系统就会把本类所能调用的非静态方法和变量都显示出来让你选择,提高了编码效率。这种情况下使用的this关键字代表本类。除了这种用法,this关键字还可以调用自己的构造方法, 使用方法 消防栓的使用方法指针万用表的使用方法84消毒液使用方法消防灭火器使用方法铁材计算器使用方法 如代码5-5所示。5.1.7父类对象引用子类实例——父母代表孩子做事【本节示例参考:\源代码\C5\Example_1】前面的继承都是子类继承父类的属性和方法,使创建子类变得简单,实现了代码重用。继承还有一个重要的特性,父类对象可以引用子类实例,也就是子类实例可以赋值给父类对象变量。这个特性可以这样理解,儿子继承于父亲,儿子又把管理自己事务的权利交给父亲,那么父亲就可以代表儿子处理事务,这就实现了父类对象引用子类实例。现实生活中这样的例子很多,父母可以代表儿子处理事务,总公司可以代表子公司行使权利等。下面代码5-6演示这个特性的用法,从中可以看出这个特性有很多实际的好处。5.2面向对象的多态性面向对象的语言有三大特征:继承、多态和封装,前一节我们学习了其中之一:继承,这部分开始学习另一个重要特性:多态。我们接触过的方法重载是多态的表现之一,那么到底什么是多态?在编写应用程序中如何使用多态呢?5.2.1什么是多态下面举一个生活中的例子来理解多态。如果我们要求3种人——孩子、运动员、音乐演奏者都执行一个动作“play”,会发生什么情况呢?孩子会出去玩耍。运动员进行比赛。演员开始演奏。对于同一个命令,不同的人会有不同的反应,执行不同的动作,这就是生活中的一个多态。在程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 中,对于同一个方法,由于执行方法的对象不同,方法的内容就不同。执行后的结果也是不相同的。多态是指两个或者多个不同类的对象,调用同一个方法出现不同的结果。前面我们学习的方法重载,方法名完全相同,但是不同的对象调用时,由于参数不同,执行的结果是不相同的,就是多态的一种表现。本章主要学习C#中实现多态的技术——虚拟方法和抽象方法。5.2.2虚拟方法实现多态【本节示例参考:\源代码\C5\Example_Ways】下面先来看一个例子。假若有一个动物类,类中有一个方法cry()描述动物叫声,不同的动物叫声是不一样的。根据继承的特征,把类中公共部分的内容放在父类中,那么cry()这个方法就应该放在父类中,根据这样的思路编写的程序如下:运行后发现狗和猫的叫声显示都是相同的,都是调用了父类的Cry()方法,现在我们希望在同一个方法Cry()中能够体现出不同动物具有不同的叫声,那么在子类中就应该重新描述Cry(),就是重写Cry()方法。重写父类方法就是修改它的实现,或者说在派生类中对它进行重新编写。在父类中用virtual关键字声明的方法在子类中可以重写,就是虚拟方法。虚拟方法语法如下:访问修饰符virtual返回类型方法名(){//方法体}5.3抽象类和抽象方法上一节的示例代码5-1中,创建了父类Anmial,在父类中添加了一个方法Cry(),这个方法在子类中进行了重写,方法体中的语句并没有显示出来。那么可不可以在父类的方法体中不写具体代码,只规定子类必须要实现Cry()这个方法呢?当然是可以的。这就是这一节要学习的抽象类和抽象方法。5.3.1抽象类和抽象方法概述如果说继承是面向对象设计理论的基石,那么抽象理论和方法就是继承理论的顶梁柱。在汉语词典中抽象是这样解释的:将几个有区别的物体的共同特性或形象抽取出来或孤立地进行考虑的行动或过程。可以看出抽象就是从事物中提取特征和性质,并不是事物本身。具体应该如何理解呢?大家都知道,学生有一个共同的特征是必须要学习,那么具体学什么,如何学,每一个学生就不一样了,这样我们就可以提取出学习这个动作作为抽象方法,而不考虑具体内容。上一节的例子中动物类都有叫的动作,具体哪种动物如何叫,暂不考虑,我们先把共性抽取出来。简单地说,用来描述这些共性的类就是抽象类,抽象类中不考虑具体实现,只确定必须具有的行为,就是抽象方法。抽象方法是一个没有实现的方法,使用关键字abstract定义抽象方法,语法如下:<访问修饰符>abstract返回类型方法();例如:publicabstractvoidCry();5.3.2抽象类和抽象方法的使用【本节示例参考:\源代码\C5\Example_AbstractTest】定义抽象类和抽象方法的目的就是为子类提供一种规定,约束子类的行为。C#中通过方法重写来实现抽象方法。当一个抽象基类派生一个子类时,子类将继承基类的所有特征,重新实现所有抽象方法。在子类中实现基类的抽象方法,是使用override关键字来重写基类方法。语法如下:访问修饰符override返回类型方法(){//方法体}5.4接口通过前面的学习知道,C#中的派生类只能有一个基类,不支持多重继承。如果要描述一个儿子继承了父亲的优点和财产,同时也继承的母亲的优点和财产,该怎么处理呢?这时就要用到接口来实现,其实接口就是为了实现多重继承而产生的。C#中规定一个派生类,只能有一个父类,但可以实现多重接口。这节主要学习接口的概念,以及C#中如何使用接口实现多重继承。5.4.1接口概述接口是面向对象编程的一个重要技术,在C#中负责实现多重继承。接口是单纯对事物行为的描述。比如我们家里的电器都有“开”和“关”两个行为,开关的作用在于打开或关闭电器,而开关的形式也是不一样的,电灯、电视、电扇、电冰箱各自完成开关的动作也是不一样的,但是所有的电器都必须具有开关的功能,这是一个规定,在我们程序设计中,这个规定就是接口。接口只包含行为的定义,不能有任何具体的实现。可以把接口看成是一种 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 ,它可以约束类的行为,它规定了实现这个接口的类必须具有的内容。在上面的电器例子中,可以定义一个接口,接口中有开和关两个方法,只是方法的声明,不包括具体实现。电视、电冰箱等电器类产品就必须遵守接口的规定,包含开和关功能,具体实现各个不同的开关方法。5.4.2接口定义接口用来描述一种程序的规定,可定义属于任何类或结构的一组相关行为。接口可由方法、属性、事件、索引器或这四种成员类型的任何组合构成。接口不能包含字段。接口成员一定是公共的。定义接口的语法如下:<访问修饰符>interface接口名{//接口主体}5.4.3接口的实现【本节示例参考:\源代码\C5\Example_Interface】定义了接口后,就要在子类中实现。C#中通常把子类和父类的关系称为继承,子类和接口的关系称为实现。子类可以继承一个父类,可以实现多个接口。接口中不能定义构造函数,所以接口不能实例化。5.4.4接口的继承【本节示例参考:\源代码\C5\Example_MultiInterface】类之间可以继承,和类一样,接口也允许继承。C#中接口可以多继承,接口之间可以互相继承和多继承,普通类和抽象类可以继承自接口。一个类可以同时继承一个类和多个接口,但是接口不能继承类。假如你是一名在职学习的学生,你就具有双重身份,一个身份是学生,必须完成学生应该学习的内容,另一个身份是职员,你也必须完成你的工作任务,否则就会被“炒鱿鱼”,进一步考虑,如果你是计算机专业的学生,规定除了学习必须的基础课程外,还必须学习C#程序设计。现在要建立这样一个模型,应该如何建立呢?首先建立一个学生的接口,规定学生必须学习,再建立一个职员的接口,规定职员必须完成的工作任务。计算机专业的学生,除了要完成一般学习任务,还要学习C#程序设计,我们可以再定义一个接口,继承学生接口,规定自己的学习任务。代码5-11演示接口的多重继承。5.4.5接口、类和抽象类【本节示例参考:\源代码\C5\Example_Multi】一个类可以同时继承类和接口,或者抽象类和接口,抽象类和类不能在一个类的继承列表中同时出现。如果子类同时继承类或抽象类和接口,一定要把类或者抽象类写在前面,接口写在后面,类名和接口名之间用“,”隔开,接口没有先后顺序。每一种继承都要根据各自的规则去实现。下面继续完善代码5-11的功能。希望任何学生都要具有姓名、性别、年龄和学号的属性,当然可以直接在计算机专业的学生类中创建,但是如果还有别的专业的学生,那么都要重新写一遍,不符合代码重用的原则,我们把公用代码提取出来创建一个父类,在父类中赋予这些属性就可以。由于学号只有学生才有,把学号属性放在学生接口中定义更合理,更有利于扩展。5.4.6显式接口实现【本节示例参考:\源代码\C5\Example_Display】从上面的代码中可以知道,一个类可以实现多个接口,如果两个接口中有相同的方法名,那么同时实现这两个接口的类,就会出现不确定情形,在编写方法时,不知道该实现哪个接口的这个方法了。为了解决这个问题,C#提供了显式接口实现的技术,就是在方法名称前加上接口名称,用接口名称来限定该成员变量。5.5综合实战——动物特性的面向对象描述【本节示例参考:\源代码\C5\AnimalTest】通过前面的学习,我们对C#面向对象的技术有了初步了解,本节利用所学知识,完成动物特性的描述,具体问题如下:【问题:动物特性描述】狗生活在陆地上(是一种陆生动物),既是哺乳类的,也是肉食性的。狗通常的时候和人打招呼会通过“摇摇尾巴”,在被抚摸感到舒服的时候,会“旺旺叫”,而在受到惊吓情绪烦躁时,会发出“呜呜”声;猫也生活在陆地上(是一种陆生动物),既是哺乳类的,也是肉食性的。猫通常的时候和人打招呼会发出“喵~”的声音,在被抚摸情绪很好时,会发出“咕噜咕噜”声,而在受到惊吓时,会发出“嘶嘶”声;青蛙是一种两栖动物(既是水生动物,也是陆生动物),既不是哺乳类的,也不是肉食性的,属于卵生。当青蛙情绪好的时候,会在岸边“呱呱呱”的唱歌,而在受到惊吓时,会“扑通一声跳入水中”;5.5.1.第一阶段,不考虑情绪影响动物打招呼的方式编写Animal类,将该类定义为抽象类,抽象类中可以定义属性和方法,定义了抽象方法SayHello(),表示打招呼。代码片段如下:01publicabstractclassAnimal02{03//下面的属性被声明为保护类型的,允许在子类中访问04protectedboolmammal=true;//是否哺乳动物属性05protectedboolcarnivorous=true;//是否食肉动物属性0607//打招呼的方式,该方法是抽象的,所以必须在子类中实现08abstractpublicstringSayHello();09publicboolIsMammal()//判断是否哺乳动物10{11return(mammal);12}13publicboolIsCarnivorous()//判断是否食肉动物14{15return(carnivorous);16}17}5.5.2第二阶段,考虑动物情绪不同表现不同从代码运行结果可以看出符合要求,第一阶段编码完成。下面在此基础上继续完善,考虑动物情绪状况,不同的情绪会有不同的反应,可以用方法重载来实现。在Anmial类中添加一个抽象方法SayHello(),这个方法要包括动物情绪,把动物情绪作为参数传递,包括情绪的编码如下:01//将情绪的状态定义为静态常量02publicstaticconstintscared=1;//情绪不好,烦躁03publicstaticconstintgood=2;//情绪好04//定义情绪字段及属性05privateintmood;06publicintMood07{08get{returnmood;}09set{mood=value;}10}11abstractpublicstringSayHello(intmoodval);//带有情绪的打招呼方法5.5.3考虑陆生动物和水生动物进一步完善前面的代码,考虑这三个对象分别属于水生动物和陆生动物,这属于两个大类,由于C#不支持类的多重继承,我们用接口实现。定义水生动物和陆生动物接口,在三个派生类中分别实现接口,接口定义示例如下:01interfaceILandAnimal//陆生动物接口02{03publicintgetNumberOfLegs();//返回有多少只脚04}05interfaceIWaterAnimal//水生动物接口06{07publicboolgetGillFlag();//返回是否有腮08publicboolgetLaysEggs();//返回是否产卵09}5.6小结这章主要学习面向对象理论的三个重要技术支撑中的继承和多态。主要内容总结如下:继承不仅是类之间的继承,类和接口、接口与接口之间都可以实现继承。继承的类之间必须符合“是不是”的规则,不能随便派生。被继承的类称为基类或父类,派生的类称为派生类或子类。子类继承父类的成员,也可以拥有自己的成员。继承具有传递性和单一性。base关键字可以调用父类的构造函数、属性和方法。this关键字可以调用本类成员和构造函数。多态是相同方法调用可实现不同的实现方式。C#中通过虚拟方法和抽象方法实现多态。抽象方法是没有实现的方法,用abstract关键字修饰。包含抽象方法的类一定是抽象类。抽象类中可以有普通方法。抽象方法和虚拟方法一样,要在子类中重写,必须使用关键字override,除非它的子类还是抽象类。接口是定义一组规范或一个标准,要求实现它的类必须遵循这个规范或者标准,实现某种功能。无论抽象类还是普通类,一个类只能继承一个类,但能实现多个接口。抽象类只需子类实现它的抽象方法,接口要求必须实现它的所有成员。显式接口实现时要用接口名去限制接口中的成员,方法前不能添加任何访问修饰符。
本文档为【C#3.0教程ppt\第5章 父子关系—继承】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_620078
暂无简介~
格式:ppt
大小:196KB
软件:PowerPoint
页数:0
分类:
上传时间:2018-09-12
浏览量:5