




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章面向对象的高级编程 封装 继承与多态版本控制接口委托泛型处理 本章教学目的介绍面向对象高级编程的相关知识 使学生对C 高级编程有一个感性认识 本章教学要求 1 掌握继承 泛型的概念及基本用法 2 掌握与实验有关的相关内容 包括封装 继承与多态 泛型处理 3 了解其他内容 实验中的问题解答 如何添加某个事件 例如窗体的Shown事件 如何删除某个事件 答 添加和删除事件均在设计视图下利用属性中的事件完成 使用textBoxStartAmount Focus 与使用键让某控件获取焦点有何不同 答 前者用于动态设置 后者用于静态设置 实验2 privatedoubleCaculate doublestartAmount doublerate intcount 叠加次数count是什么意思 答 叠加次数是指到期后将计算出来的利息作为存款再次计算 例如存款时间为1年 则按年算息叠加次数为1 按月算息叠加次数为12 按季度算息叠加次数为4 实验报告什么时候交 进度如何安排 答 各人根据自己的情况安排进度 完成一个 写一个实验报告 如何定义属性 如何给属性赋值 如何获取属性的值 答 见书上P59例3 10 4 1封装 继承与多态 封装 隐藏调用者不需要了解的信息 继承 简化类的设计 多态 类为名称相同的方法提供不同实现方式的能力 封装 模块信息通过类封装类的成员通过字段 属性 方法 事件封装私有的用private可以被继承的用protected公共成员用public不要为了方便把什么都定义成public不要为了方便把什么都定义成static通过属性进行封装的例子 P73例4 1 封装举例 对象封装了对象的数据以及对这些数据的操作 对象是属性和操作的组合对象的表现 服务 接口 和实现细节分开 MyClass csusingSystem namespaceConsoleTest classMyClass privateintnumber publicintNumber get returnnumber set if value 0 number value Program csusingSystem namespaceConsoleTest publicclassProgram publicstaticvoidMain MyClassme newMyClass me Number 1 Console WriteLine Number 0 me Number Console ReadLine 回答 Number输出的值是多少 练习 1 Question47 单选 InObjectorientedProgramming howwouldyoudescribeencapsulation 1 Theconversionofonetypeofobjecttoanother 2 Theruntimeresolutionofmethodcalls 3 Theexpositionofdata 4 Theseparationofinterfaceandimplementation 答案 4 继承 继承表示现实世界中遗传关系的直接模拟 它表示类之间的内在联系以及对属性和操作的共享 继承 续 声明扩充类的语法 访问修饰符 class扩充类名称 基类名称 程序代码 扩充类继承了所有定义在基类中数据的定义和方法 但是扩充类不继承基类的构造函数 继承的例子 1 P76例4 2 两种实现继承的方式 类继承和接口继承 类继承只允许单一继承 接口可实现多重继承 被继承的类叫基类继承自其他类的类叫扩充类 多态 用相同的操作名在一个类层次的不同类中实现不同的功能 相同的消息由同一 父 类的不同对象接收时 导致不同的行为 举例 几何图形类层次中的多态性 其派生类 圆 长方形 三角形 等都有方法 求面积 几何图形 圆 三角形 几何图形 圆 Shape类GetArea Rectangle类GetArea Circle类GetArea Triangle类GetArea 1 虚拟方法在基类中 如果想让某个方法或者事件被扩充类重写 可以使用修饰符virtual表明 publicvirtualvoidmyMethod 程序代码 扩充类则用override重写 publicoverridevoidmyMethod 程序代码 多态 续 MyClass csusingSystem namespaceConsoleTest classMyClass publicvirtualvoidHello Console WriteLine 123 MyNewClass csusingSystem namespaceConsoleTest classMyNewClass MyClass privatestringstr hello publicoverridevoidHello Number 2 Console WriteLine str 多态 续 使用虚拟方法和重写方法时 要注意下面几个方面 虚拟方法不能声明为静态的 Virtual不能和private一起使用 重写方法的名称 参数个数 类型以及返回值都必须和虚拟方法的一致 举例P79页例4 4 多态 续 2 隐藏基类的方法在扩充类中 可以使用new关键字来隐藏基类的方法 即使用一个完全不同的方法取代旧的方法 与方法重写不同的是 使用new关键字时并不要求基类中的方法声明为virtual 只要在扩充类的方法前声明为new 就可以隐藏基类的方法 多态 续 3 抽象类使用abstract修饰符 抽象类只能做基类 抽象类与非抽象类的区别 第一是抽象类不能直接被实例化 只能在扩充类中通过继承使用 对抽象类使用new运算符会产生编译时错误第二个不同点是抽象类可以包含抽象成员 而非抽象类不能包含抽象成员 当从抽象类派生非抽象类时 这些非抽象类必须具体实现所继承的所有抽象成员 补充题目 Question32 单选 以下描述错误的是 1 在C 中支持抽象类而在C 中不支持抽象类 2 C 中可在头文件中声明类的成员而在CPP文件中定义类的成员 在C 中没有头文件并且在同一处声明和定义类的成员 3 在C 中可使用new修饰符显式隐藏从基类继承的成员 4 在C 中要在派生类中重新定义基类的虚函数必须在前面加Override 练习 2 abstractclassBaseClass publicvirtualvoidMethodA Console WriteLine BaseClass classClass1 BaseClass publicvoidMethodA Console WriteLine Class1 classClass2 Class1 在Main方法中执行下列语句 Class2o newClass2 o MethodA 问 执行结果是什么 4 2版本控制 用C 编写方法时 如果在扩充类中重写基类的方法 需要用override声明 要隐藏基类的方法 需要用new声明 这就是C 进行版本控制的依据 调用非虚拟方法时不会受到版本的影响调用虚拟方法的实现部分可能会因扩充类的重写而影响执行结果 举例 P83例4 8P84例4 9 4 2版本控制 续 调用原则 调用继承的最后实现部分的方法P85例4 10C 允许派生类包含与基类方法名称相同的方法 规则如下 1 基类方法必须声明为virtual2 若派生类中方法前无new或override关键字 方法执行按存在new关键字一样执行3 若派生类中方法前带new关键字 则此方法被定义为独立于基类的方法4 若派生类中方法前带override关键字 则派生类调用此方法 而非基类的方法 5 可从派生类中使用base关键字调用基类方法 补充知识 C 面试题 publicclassA publicA Console WriteLine A publicvirtualvoidFun Console WriteLine A Fun publicclassB A publicB Console WriteLine B publicnewvoidFun Console WriteLine B Fun publicstaticvoidMain Aa newB a Fun 输出结果为 ABA Fun 4 3接口 接口的主要特点是只有声明部分 没有实现部分 接口成员的实现是通过类完成的 定义在接口中的方法都是public的 使用interface关键字声明一个接口 常用的语法是 访问修饰符 interface接口名称 接口体 一般情况下 以大写的 I 开头指定接口名 表明这是一个接口 需要在不相关的类中实现同样的功能时 可以使用接口 4 3接口 P88例4 11显示方式实现接口例4 12注意 显示实现接口时 不能通过类的实例进行访问 而必须使用接口实例 通过接口实现多继承例4 13 补充知识 C 面试题 不定项选择题以下叙述正确的是 A 接口中可以有虚方法 B 一个类可以实现多个接口 C 接口不能被实例化 D 接口中可以包含已实现的方法 B C 2 以下叙述正确的是 A 接口和抽象类一样均只能声明 而不能有实现部分 B 类可以继承多个接口 但仅能从一个抽象类或其它类型的单个类继承 C 接口中可以定义属性 方法和事件 但只声明不实现 D 类的多继承可以通过接口实现 B C D 4 4委托 类似与C 中的函数指针 但有很大不同委托的声明例如 publicdelegatevoidFuncDelegate stringstr 委托的使用具体内容不再详细讲述 4 5序列化与反序列化 序列化获取对象并将其状态信息转换为可存储或可传输形式的过程 反序列化将对象还原回序列化之前的内容 序列化和反序列化是一个互逆的过程 NETFramework提供的两种序列化技术二进制序列化XML和SOAP序列化 4 5序列化与反序列化 1 如何序列化一个类 在类的上方加上Serializable特性即可 Serializable publicclassMyClass 2 二进制序列化MyClassuser newMyClass IFormatterformater newBinaryFormatter Streamstream newFileStream UserInfo bin FileMode Create FileAccess Write FileShare None formater Serialize stream user stream Close 特点 二进制序列化会将一个类的所有成员变量都进行序列化 包括私有变量 公共属性 方法等 4 5序列化与反序列化 3 二进制反序列化IFormatterformatter newBinaryFormatter Streamstream newFileStream UserInfo bin FileMode Open FileAccess Read FileShare Read MyClassc MyClass formatter Deserialize stream stream Close 特点 反序列化后 对象c与序列化之前的状态完全相同 补充 二进制序列化与反序列化举例 保存窗体位置 颜色与数据库连接信息设置 补充 二进制序列化与反序列化举例 当输入服务器等信息 改变窗体前景色 位置后 退出应用程序 再次启动 可看到仍然是退出前的状态 4 5序列化与反序列化 4 XML序列化 1 XML序列化仅将对象的公共字段和属性值序列化为XML流 而不转换方法 索引器 私有字段或只读属性 只读集合除外 2 XML序列化不包括类型信息 即不能保证序列化后的对象在被反序列化时 变为同一类型的对象 3 XML序列化的实现步骤Class1user newClass1 user AccountName aa XmlSerializermySerializer newXmlSerializer typeof Class1 StreamWritermyWriter newStreamWriter UserInfo xml mySerializer Serialize myWriter user myWriter Close 4 5序列化与反序列化 4 XML反序列化的步骤Class1c XmlSerializermySerializer newXmlSerializer typeof Class1 FileStreammyFileStream newFileStream UserInfo xml FileMode Open c Class1 mySerializer Deserialize myFileStream myFileStream Close 注意 反序列化一个对象时不会调用构造函数 这一点与创建对象不同 4 6泛型处理 泛型 Generic 一般用在集合和在集合上运行的方法中 NET框架2 0以前的版本不支持泛型 使用泛型具有以下明显的优点 1 可以避免以下两个问题 内部实现代码冗余和困扰开发人员的含混不清的编译器错误提示 2 类型安全 3 二进制代码重用 4 性能 5 清晰性 4 6泛型 问题描述 publicclassStack object m Items publicvoidPush objectitem publicobjectPop 使用举例 Stackstack newStack stack Push 1 intnumber int stack Pop stack Push str stringstr string stack Pop 基于Object的堆栈缺点 性能问题值类型需频繁地装箱 拆箱 造成较多的垃圾碎片 增加垃圾回收的负担引用类型需要强制类型转换类型安全问题 更严重 编译时任务类型都转换成object 无法保证运行时类型安全 例如 Stackstack newStack stack Push abc intnumber int stack Pop 4 6泛型 解决办法 publicclassIntStack int m Items publicvoidPush intitem publicintPop publicclassStringStack string m Items publicvoidPush stringitem publicstringPop 功能相似 代码冗余 维护麻烦 基于Object的堆栈 IntStackStringStack 代码冗余 维护复杂 工作效率低 性能问题 类型安全问题 有没有好的解决办法 有 泛型 解决方法 采用泛型 publicclassStack T m Items publicvoidPush Titem publicTPop 泛型是如何实现的 在 NET2 0中 泛型在IL 中间语言 和CLR本身中具有本机支持编译泛型时 就像编译类一样 泛型仅保留一个占位符 而用特定类型实例化的泛型代码 编译时会将泛型替换为实例化的特定类型 泛型实现 publicclassStack T m Items publicvoidPush Titem publicTPop 使用举例 Stackstack newStackstack Push 1 intnumber stack Pop 泛型的定义和引用 泛型定义代码语法如下 访问修饰符 返回类型 泛型支持类型泛型名称其中CLR支持的泛型类 结构 方法 接口和委托等 泛型类定义举例 classNode Tdata Nodenext 例4 19引用泛型类 泛型的引用 泛型类定义举例 voidSwap refTitem1 refTitem2 Ttemp item1 item1 item2 item2 temp 例4 20引用一个泛型方法程序举例 使用泛型方法来实现int double float类型的数据交换方法 常用泛型 凡是有对应泛型类型的类就尽量不要使用早期提供的非泛型类型的类 下面的泛型类型对应于低版本提供的类型 泛型类低版本提供的非泛型类ListArrayListDictionaryHashtableQueueQueueStackStackSortedListSortedList 实验中用到的泛型 SortedList 按键排序的键值对集合 是运算复杂度为O logn 的二进制搜索树 常用方法 Add方法 将带有指定键和值的元素添加到SortedList中例如 注意 如果插入重复的键会产生异常 SortedListopenWith newSortedList openWith Add txt notepad exe openWith Add bmp paint exe 实验中用到的泛型 续 如何遍历泛型列表中的每个键值对SortedListlist newSortedList list Add a 123 list Add b 234 list Add c 456 foreach stringstrinlist Keys Console WriteLine keyis str valueis list str ToString 实验中用到的泛型 续 TryGetValue方法 获取与指定的键相关联的值 例如 stringvalue if openWith TryGetValue tif outvalue Console WriteLine Forkey tif value 0 value else Console WriteLine Key tif isnotfound 实验中用到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件产品战略合作伙伴联盟合同
- 老年医学护理试题题库及答案解析
- 浙江省安全员考试题库窍门及答案解析
- 证券从业者知识考试题库及答案解析
- 煤矿安全训练题库及答案解析
- 安全a类人员考核题库及答案解析
- 护理岗位知识竞赛试题库及答案解析
- 口腔护理评估考试题库及答案解析
- 2025年自考专业(护理)题库检测试题打印含完整答案详解
- 广州网约车司机从业资格考试题库及答案
- 护理疑难病例讨论的目的与实施策略
- 超声波洗鞋机技术解析与应用
- 公司人才认定管理办法
- 理解当代中国 大学英语综合教程1(拓展版) B1U1课件 Unit1 Youth on the rise
- 永辉超市培训课件
- 河北计算机单招数学试卷
- 2025年辅警面试考试试题库目(答案+解析)
- 航运大数据分析与决策支持
- 2025至2030全球及中国两轮组合仪表行业产业运行态势及投资规划深度研究报告
- 2024公路运营领域重大事故隐患判定标准解读学习课件
- 耕地保护培训课件
评论
0/150
提交评论