第八章继承和多态性.ppt

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 继承和多态性 基本要求 1.理解继承的概念,掌握解基类和派生类; 2.掌握隐藏基类成员、base关键字的使用; 3.掌握继承中构造函数的调用; 4.理解多态性的概念,掌握虚方法和方法重写; 5.掌握抽象类和抽象方法; 6.了解密封类和密封方法。 第八章 继承和多态性 主要内容 8.1 继承 8.2 多态性 第八章 继承和多态性 继承允许创建类的层次结构,是面向对象程序设计的三大特性之一。多态性是面向对象程序设计的另一个重要特性,可以分为编译时多态性(方法重载)和运行时多态性(通过虚函数来实现)。 8.1 继承 继承是面向对象程序设计语言的重要特征之一,它是指从一个或多个基类中继承数据结构和操作,形成新的类的一种机制。该机制自动地为类提供来自另一个类的操作和数据,使程序员只需要在新类中定义已有类中没有的成员。继承不仅简化了程序设计方法,显著地提高了软件的重用性,而且还使程序具有一种层次结构,使之变得容易维护,通过多层次派生可以形成一个类族。派生是继承的过程,即从已经存在的类继承得到新类的过程。 8.1 继承 8.1.1 基类和派生类 在程序设计过程中,构造类的层次结构有两种基本方法: 自顶向下:从基础类型开始向下分解,不断得到新的派生类型。例如,从“图形”细化出“平面图形”和“立体图形”,“平面图形”有可以细化为“圆”、“椭圆”、“三角形”、“多边形”等。 自底向上:对现有的一组具体类型进行抽象,得到新的类型。例如:“飞机”、“火车”、“汽车”、“轮船”可以抽象为“交通工具”。 8.1 继承 8.1.1 基类和派生类 在复杂的软件设计中,上面两种方法往往需要综合运用。.NET类库就是一个典型的面向对象的实现:Object类是其他所有类的基类,而所有的C#数据类型都是从Object类衍生而来的。 在类层次结构中被继承的类,称为基类(或父类),通过继承得到的新类,称为派生类(或子类)。 派生类能够继承基类的所有成员,并增加自己的成员来扩展功能。例P8_1。 8.1 继承 8.1.1 基类和派生类 需要注意的是:基类的保护成员可以被派生类的成员访问,但不能被派生类的对象访问。这也是私有成员和保护成员的区别。 说明:如果基类中的字段通过公有可读写属性进行了封装,那么建议将该字段定义为私有的,这样包括其派生类在内的所有其他类型都必须通过属性来访问该字段。 8.1 继承 8.1.2 隐藏基类成员 有时候派生类会使用和基类相同的成员,但希望这些成员提供和基类不同的服务。例如,可以给上例中的Truck类也定义一个Run方法,但它计算的行驶时间不仅与距离和速度有关,还有卡车的载重有关。 public class Truck { … public float Run(float distance) {return (1+load/Weight/2)*distance/speed;} } 8.1 继承 8.1.2 隐藏基类成员 此时程序仍然能够通过编译,但是编译器会警告“Truck.Run隐藏了成员AutoMobile.Run”。也就是说,如果派生类中定义了与基类相同的成员(字段名和类型相同,或是方法名称、参数类型和个数、返回类型相同),默认情况下基类的成员在派生类中会被隐藏,这也称为派生类成员覆盖了基类成员。为了提高代码的可读性,C#建议使用new关键字来明确修饰派生类中与基类相同的成员。因此,Truck类的定义应修改为: 8.1 继承 8.1.2 隐藏基类成员 public class Truck { … new public float Run(float distance) { return (1+load/Weight/2)*distance/speed; } } 8.1 继承 8.1.2 隐藏基类成员 说明:隐藏基类成员所用的new关键字是一种修饰符,它和创建对象所用的new是不相同的。此外,如果派生类中的成员与基类中的私有成员同名,那么不需要使用new运算符。 属性和索引函数这样的特殊方法也可以被覆盖。例P8_2就覆盖了基类的Run和Speed属性。 例P8_2中由于c1是Truck类型的对象,因此通过对象c1访问的是Truck中定义的Speed属性和Run方法。而通过a1(a1引用的是c1)访问的则是AutoMobile类中定义的Speed属性和Run方法。即如果派生类的成员方法隐藏了基类的成员方法,那么程序会根据对象的声明类型而非实际类型来确定调用哪一个方法。 8.1 继承 8.1.3 base关键字 前面,介绍过this关键字,表示引用当前对象,例如AutoMobile类的Run方法中“speed”和“this.speed”是等价的。C#

文档评论(0)

tiangou + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档