第章_继承和接口设计.ppt

上传人:marr****208 文档编号:133977550 上传时间:2020-06-01 格式:PPT 页数:66 大小:217KB
返回 下载 相关 举报
第章_继承和接口设计.ppt_第1页
第1页 / 共66页
第章_继承和接口设计.ppt_第2页
第2页 / 共66页
第章_继承和接口设计.ppt_第3页
第3页 / 共66页
第章_继承和接口设计.ppt_第4页
第4页 / 共66页
第章_继承和接口设计.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《第章_继承和接口设计.ppt》由会员分享,可在线阅读,更多相关《第章_继承和接口设计.ppt(66页珍藏版)》请在金锄头文库上搜索。

1、第7章继承和接口设计 7 1继承7 2多态性7 3抽象类7 4接口7 5接口在集合排序中的应用7 6泛型编程 7 1 1什么是继承一个类从另一个类派生出来时 称之为派生类或子类 被派生的类称为基类或父类 派生类从基类那里继承特性 派生类也可以作为其他类的基类 从一个基类派生出来的多层类形成了类的层次结构 7 1继承 C 中只允许单继承 即一个派生类只能有一个基类 C 中继承是可传递的 如果C从B派生 B从A派生 那么C不仅继承B的成员 还继承A的成员 C 中派生类可添加新成员 但不能删除基类的成员 C 中派生类不能继承基类的构造函数和析构函数 但能继承基类的属性 C 中派生类可隐藏基类的同名成

2、员 如果在派生类可以隐藏了基类的同名成员 基类该成员在派生类中就不能被直接访问 只能通过 base 基类方法名 来访问 C 中派生类对象也是基类的对象 但基类对象却不一定是基派生类的对象 也就是说 基类的引用变量可以引用基派生类对象 而派生类的引用变量不可以引用基类对象 C 中的继承具有以下特点 7 1 2派生类的声明派生类的声明格式如下 类修饰符 class派生类 基类 C 中派生类可以从它的基类中继承字段 属性 方法 事件 索引器等 实际上除了构造函数和析构函数 派生类隐式地继承了基类的所有成员 classA privateintn 私有字段protectedintm 保护的字段publi

3、cvoidafun 公有方法 方法的代码 classB A privateintx 私有字段publicvoidbfun 公有方法 方法的代码 从中看出Base fun 方法在B类中不用重写 因为B类继承了A类 所以可以不用重写A类中的Base fun 方法 就可以被B类调用 在主函数中包含以下代码 Bb newB 定义对象并实例化b afun 7 1 3基类成员的可访问性派生类将获取基类的所有非私有数据和行为 如果希望在派生类中隐藏某些基类的成员 可以在基类中将这些成员设为private访问成员 7 1 4按次序调用构造函数和析构函数1 调用默认构造函数的次序如果类是从一个基类派生出来的 那

4、么在调用这个派生类的默认构造函数之前会调用基类的默认构造函数 调用的次序将从最远的基类开始 classA 基类 publicA Console WriteLine 调用类A的构造函数 classB A 从A派生类B publicB Console WriteLine 调用类B的构造函数 classC B 从B派生类C publicC Console WriteLine 调用类C的构造函数 在主函数中执行以下语句 Cb newC 定义对象并实例化运行结果如下 调用类A的构造函数调用类B的构造函数调用类C的构造函数 2 调用默认析构函数的次序当销毁对象时 它会按照相反的顺序来调用析构函数 首先调用

5、派生类的析构函数 然后是最近基类的析构函数 最后才调用那个最远的析构函数 classA 基类 A Console WriteLine 调用类A的析构函数 classB A 从A派生类B B Console WriteLine 调用类B的析构函数 classC B 从B派生类C C Console WriteLine 调用类C的析构函数 在主函数中执行语句Cb newC 其运行结果如下 调用类C的析构函数调用类B的析构函数调用类A的析构函数 3 调用重载构造函数的次序调用基类的重载构造函数需使用base关键字 base关键字主要是为派生类调用基类成员提供一个简写的方法 可以在子类中使用base关

6、键字访问的基类成员 调用基类中重载构造函数的方法是将派生类的重载构造函数作如下设计 public派生类名 参数列表1 base 参数列表2 其中 参数列表2 和 参数列表1 存在对应关系 同样 在通过 参数列表1 创建派生类的实例对象时 先以 参数列表2 调用基类的构造函数 再调用派生类的构造函数 例7 1 分析以下程序的运行结果 usingSystem namespaceProj7 1 classA privateintx publicA Console WriteLine 调用类A的构造函数 publicA intx1 x x1 Console WriteLine 调用类A的重载构造函数

7、A Console WriteLine A x 0 x classB A privateinty publicB Console WriteLine 调用类B的构造函数 publicB intx1 inty1 base x1 y y1 Console WriteLine 调用类B的重载构造函数 B Console WriteLine B y 0 y classC B privateintz publicC Console WriteLine 调用类C的构造函数 publicC intx1 inty1 intz1 base x1 y1 z z1 Console WriteLine 调用类C的重载

8、构造函数 C Console WriteLine C z 0 z classProgram staticvoidMain string args Cc newC 1 2 3 7 1 5使用sealed修饰符来禁止继承C 中提供了sealed关键字用来禁止继承 要禁止继承一个类 只需要在声明类时加上sealed关键字就可以了 这样的类称为密封类 例如 sealedclass类名 这样就不能从该类派生任何子类 7 2 1什么是多态性面向对象程序设计中的多态性是一个重要的概念 所谓多态性 就是同一签名具有不同的表现行为 运算符重载和函数重载都属于多态性的表现形式 7 2多态性 7 2 2隐藏基类方法

9、当派生类从基类继承时 它会获得基类的所有方法 字段 属性和事件 若要更改基类的数据和行为 有两种选择 方法1 使用新的派生成员替换基成员方法2 重写虚拟的基成员 方法1示例 在使用新的派生方法替换基方法时应使用new关键字 例如 classA publicvoidfun Console WriteLine A classB A newpublicvoidfun 隐藏基类方法fun Console WriteLine B 在主函数中执行以下语句 Bb newB b fun 运行结果如下 B 7 2 3重写重写是指在子类中编写有相同名称和参数的方法 重写和重载的区别 后者是指编写 在同一个类中 具

10、有相同的名称 却有不同的参数的方法 也就是说 重写是指子类中的方法与基类中的方法具有相同的签名 而重载方法具有不同的签名 1 virtual关键字virtual关键字用于修饰方法 属性 索引器或事件声明 并且允许在派生类中重写这些对象 例如 以下定义了一个虚拟方法并可被任何继承它的类重写 publicvirtualdoubleArea returnx y 调用虚方法时 首先调用派生类中的该重写成员 如果没有派生类重写该成员 则它可能是原始成员 注意 默认情况下 方法是非虚拟的 不能重写非虚方法 virtual修饰符不能与static abstract和override修饰符一起使用 在静态属性

11、上使用virtual修饰符是错误的 2 重写方法override方法提供从基类继承的成员的新实现 通过override声明重写的方法称为重写基方法 重写的基方法必须与override方法具有相同的签名 注意 不能重写非虚方法或静态方法 重写的基方法必须是virtual abstract或override的 例7 2 分析以下程序的运行结果 usingSystem namespaceProj7 2 classStudent protectedintno 学号protectedstringname 姓名protectedstringtname 班主任或指导教师publicvoidsetdata i

12、ntno1 stringname1 stringtname1 no no1 name name1 tname tname1 publicvirtualvoiddispdata 虚方法 Console WriteLine 本科生学号 0 姓名 1 班主任 2 no name tname classGraduate Student publicoverridevoiddispdata 重写方法 Console WriteLine 研究生学号 0 姓名 1 指导教师 2 no name tname classProgram staticvoidMain string args Students ne

13、wStudent s setdata 101 王华 李量 s dispdata Graduateg newGraduate g setdata 201 张华 陈军 g dispdata 例7 3 设计一个控制台应用程序 采用虚方法求长方形 圆 圆球体和圆柱体的面积或表面积 usingSystem namespaceProj7 3 publicclassRectangle 长方形类 publicconstdoublePI Math PI protecteddoublex y publicRectangle publicRectangle doublex1 doubley1 x x1 y y1 p

14、ublicvirtualdoubleArea 求面积 returnx y publicclassCircle Rectangle 圆类 publicCircle doubler base r 0 publicoverridedoubleArea 求面积 returnPI x x classSphere Rectangle 圆球体类 publicSphere doubler base r 0 publicoverridedoubleArea 求面积 return4 PI x x classCylinder Rectangle 圆柱体类 publicCylinder doubler doubleh

15、 base r h publicoverridedoubleArea 求面积 return2 PI x x 2 PI x y classProgram staticvoidMain string args doublex 2 4 y 5 6 doubler 3 0 h 5 0 Rectanglet newRectangle x y Rectanglec newCircle r Rectangles newSphere r Rectanglel newCylinder r h Console WriteLine 长为 0 宽为 1 的长方形面积 2 F2 x y t Area Console W

16、riteLine 半径为 0 的圆面积 1 F2 r c Area Console WriteLine 半径为 0 的圆球体表面积 1 F2 r s Area Console WriteLine 半径为 0 高度为 1 的圆柱体表面积 2 F2 r h l Area 7 3抽象类 7 3 1什么是抽象类在类声明中使用abstract修饰符的类称为抽象类 抽象类具有以下特点 抽象类不能实例化 抽象类可以包含抽象方法和抽象访问器 抽象类中可以存在非抽象的方法 不能用sealed修饰符修改抽象类 这也意味着抽象类不能被继承 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现 抽象类可以被抽象类所继承 结果仍是抽象类 7 3 2抽象方法在方法声明中使用abstract修饰符以指示方法不包含实现的 即为抽象方法 抽象方法具有以下特性 声明一个抽象方法使用abstract关键字 抽象方法是隐式的虚方法 只允许在抽象类中使用抽象方法声明 一个类中可以包含一个或多个抽象方法 因为抽象方法声明不提供实际的实现 所以没有方法体 方法声明只是以一个分号结束 并且在签名后没有大括号 抽象方法实

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号