




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章面向对象的高级编程 5 1类的继承与多态性5 2版本控制5 3接口5 4委托和事件5 5反射5 6序列化与反序列化 5 1类的继承与多态性 封装 隐藏调用者不需要了解的信息 继承 简化类的设计 为系统维护提供便利 多态 类为名称相同的方法提供不同实现方式的能力 5 1 1基类和扩充类 继承表示现实世界中遗传关系的直接模拟 它表示类之间的内在联系以及对属性和操作的共享 5 1 1基类和扩充类 OOL中继承的两种实现方式 实现继承和接口继承 被继承的类叫基类 父类从基类继承来的类叫扩充类 派生类 子类实现继承 表示一个类型派生于一个基类型 拥有该基类型的所有成员字段和函数 在实现继承中 派生类型的每个函数采用基类型的实现代码 除非在派生类型的定义中指定重写该函数的实现代码 例如 System Windows Forms TextBox和System Windows Forms ListBox派生于System Windows Forms Control 并重写了函数 或提供了新的函数 以实现特定类型的控件 接口继承 表示一个类型只继承了函数的签名 没有继承任何实现代码 C 中 实现继承只允许单一继承 接口可实现多重继承 因为System Object是一个公共的基类 所以每个C 类 除了Object类之外 都有一个基类 还可以有任意多个基接口 5 1 1基类和扩充类 声明扩充类的语法 访问修饰符 class扩充类名称 基类名称 程序代码 扩充类继承了所有定义在基类中数据的定义和方法 但是扩充类不继承基类的构造函数 注意 C 不支持私有继承 因此基类名上没有public或private限定符如果在类定义中没有指定基类 C 编译器就假定System Object是基类 5 1 1基类和扩充类 例5 1 基类和扩充类的定义及用法 5 1 2多态性 多态性是指对象可以表示多个类型的能力 在C 中 多态性的定义是 同一操作作用于不同的类的实例 不同的类将进行不同的解释 最后产生不同的执行结果 3种实现多态性的方法 通过继承实现多态性 通过抽象类实现多态性 通过接口实现多态性 5 1 2多态性 1 虚拟方法在基类中 如果想让某个方法或者事件被扩充类重写 可以使用修饰符virtual表明 publicvirtualvoidmyMethod 虚拟方法 程序代码 扩充类则用override重写 publicoverridevoidmyMethod 程序代码 5 1 2多态 续 使用虚拟方法和重写方法时 要注意下面几个方面 虚拟方法不能声明为静态的 virtual不能和private一起使用 重写方法的名称 参数个数 类型以及返回值都必须和虚拟方法的一致 5 1 2多态 续 例5 2 重写基类的方法 5 1 2多态 续 2 隐藏基类的方法在扩充类中 可以使用new关键字来隐藏基类的方法 即使用一个完全不同的方法取代旧的方法 与方法重写不同的是 使用new关键字时并不要求基类中的方法声明为virtual 只要在扩充类的方法前声明为new 就可以隐藏基类的方法 classMyDerivedClass HisBaseClass publicnewintMyGroovyMethod somegroovyimplementationreturn0 例5 3 5 1 2多态 续 3 在扩充类直接调用基类的方法使用base关键字classCustomerAccount publicvirtualdecimalCalculatePrice implementationreturn0 0M classGoldAccount CustomerAccount publicoverridedecimalCalculatePrice returnbase CalculatePrice 0 9M 5 1 3抽象类 使用abstract修饰符 抽象类只能做基类 抽象类与非抽象类的区别 第一是抽象类不能直接被实例化 只能在扩充类中通过继承使用 对抽象类使用new运算符会产生编译时错误 第二个不同点是抽象类可以包含抽象成员 而非抽象类不能包含抽象成员 当从抽象类派生非抽象类时 这些非抽象类必须具体实现所继承的所有抽象成员 publicabstractclassoneClass publicinti publicvoiddenylau i 10 publicabstractvoidmethod 抽象方法 在抽象类中抽象方法不提供实现 例5 4 5 1 4密封类 密封类是指不能被其他类继承的类 在C 语言中 使用sealed关键字声明密封类 C 还提出了密封方法 sealedmethod 的概念 带有sealed修饰符的方法称为密封方法 sealed关键字也可以限制基类中的方法 防止被扩充类重写 密封方法同样不能被扩充类中的方法继承 也不能被隐藏 publicabstractclassEmployee publicvirtualvoidPay publicabstractvoidCalculatePay publicsealedclassHourlyEmployee Employee 密封类publicsealedoverridevoidPay 密封方法CalculatePay publicoverridevoidCalculatePay 如果试图通过使用下面的语句从密封类继承 classMyDerivedC HourlyEmployee Error 将收到错误信息 MyDerivedC cannotinheritfromsealedclass HourlyEmployee 5 1 5继承过程中构造函数的处理 构造函数的处理顺序 C 在内部按照下列顺序处理构造函数 1 先父母 后自己 被继承的父类先构造 继承于父类的子类后构造 2 静态优先 静态构造函数 静态参数都是优先于非静态构造函数 非静态参数构造 例5 5 继承机制中构造函数的用法 5 2版本控制 版本控制 Versioning 主要是为了解决组件的版本不兼容的问题 版本控制是一个过程 它以兼容的方式对组件进行不断的改进 版本兼容的方式有 源代码级兼容 依赖于旧版本的代码在重新编译之后能够与新版本兼容 二进制兼容 依赖于旧版本的应用程序无需重新编译就能与新版本兼容 在解决版本问题时 c 要求开发人员清楚地表达他们的意图 C 语言被设计为不同库中的基类和派生类之间的版本控制可以衍生 并保持向后兼容 方法 用C 编写方法时 如果在扩充类中重写基类的方法 需要用override声明 要隐藏基类的方法 需要用new声明 调用非虚拟方法时不会受到版本的影响调用虚拟方法的实现部分可能会因扩充类的重写而影响执行结果 在C 中 基类和派生类都可以自由演变 并能够维持二进制兼容性 5 2版本控制 例5 6 使用virtual new与override进行版本控制 5 3接口 接口好比一种模版 这种模版定义了对象必须实现的方法 其目的就是让这些方法可以作为接口实例被引用 接口中可以定义一个和多个方法 属性 索引指示器和事件 接口的主要特点是只有声明部分 没有实现部分 接口是函数成员声明的集合 接口成员的实现是通过类或结构完成的 如果类或结构从一个接口派生 则这个类或结构负责实现该接口中所声明的所有成员 一个接口可以从多个接口继承 而一个类或结构可以实现多个接口 由于C 语言不支持多继承 因此 如果某个类需要继承多个类的行为时 只能使用多个接口加以说明 5 3接口 1 接口的声明使用interface关键字声明一个接口 常用的语法是 访问修饰符 interface接口名称 接口体 方法 属性 索引指示器和事件 一般情况下 以大写的 I 开头指定接口名 表明这是一个接口 访问修饰符 new public protected internal private 声明接口时 需注意以下内容 C 中的接口是独立于类来定义的 接口成员只能是方法 属性 索引指示器和事件 不能是常量 域 操作符 构造函数或析构函数 不能包含任何静态成员 接口成员声明不能包含任何修饰符 接口成员默认访问方式是public 类可以继承一个基类 接口根本不能继承类 5 3接口 2 接口的继承接口允许多继承 一个派生接口可以没有基接口 也可以有多个基接口 继承方法 在接口声明的冒号后列出被继承的接口名字 多个接口名之间用分号分割 例子如下 usingSystem interfaceIControl voidPaint interfaceITextBox IControl 继承了接口Icontrol的方法Paint voidSetText stringtext interfaceIListBox IControl 继承了接口Icontrol的方法Paint voidSetItems string items interfaceIComboBox ITextBox IListBox 可以声明新方法 例5 7 接口的声明与实现 5 3接口 3 接口实现在类中实现接口的函数成员 用类来实现接口时 接口的名称必须包含在类声明中的基类列表中 如果类实现了某个接口 类也隐式地继承了该接口的所有基接口 不管这些基接口有没有在类声明的基类表中列出 因此 如果类从一个接口派生 则这个类负责实现该接口及该接口的所有基接口中所声明的所有成员 实现接口的方法 1 显式实现接口成员2 继承接口实现 显式实现接口成员原因 定义在不同接口中的成员可能同名 为了避免多义性 C 引入显式实现接口成员方法 好处 显式接口实现允许程序员实现具有相同成员名称的两个接口 并为每个接口成员各提供一个实现 ICloneable Clone和IComparable CompareTo就是显式接口成员执行体 usingSystem interfaceIControl voidPaint interfaceITextBox IControl voidSetText stringtext classTextBox ITextBox voidIControl Paint Paint的显式接口成员执行体voidITextBox SetText stringtext SetText的显式接口成员执行体 注意 显式实现接口时 不能通过类的实例进行访问 而必须使用接口实例 interfaceIDemo voidFoo classMy1 IDemo publicvoidIDemo Foo 显式指明Foo是IDemo中的成员 classMy2 IDemo publicvoidFoo 没有明确说明Foo是谁的成员 隐式说明IDemo中的成员 My1my1 newMy1 my1 Foo 错误 显式实现不允许使用类的引用来调用起实现的成员IDemoid1 my1 id1 Foo 正确My2my2 newMy2 my2 Foo 正确IDemoid2 my2 id2 Foo 正确 例5 8 以显式方式实现接口 5 4委托和事件 回调 callback 函数是Windows编程的一个重要部分 回调函数实际上是方法调用的指针 也称为函数指针 是一个非常强大的编程特性 NET以委托的形式实现了函数指针的概念 当要把方法传送给其他方法时 需要使用委托 1 委托 Delegate del e t 类似与C 中的函数指针 不同的是C 语言的函数指针只能够指向静态的方法 而委托除了可以指向静态的方法之外 还可以指向对象实例的方法 委托的最大特点是 它不知道或不关心自己引用的对象的类 委托的应用 回调 CallBack 机制 事件处理 委托的声明属性集修饰符delegate函数返回类型定义的代表标识符 函数形参列表 修饰符包括new public protected internal和private publicdelegateintMyDelegate 代表返回类型为int 无参数的函数delegatedoubleTwoLongsOp longfirst longsecond 该委托代表的方法有两个long型参数 返回类型为double实际上 定义一个委托 是指 定义一个新类 委托实现的是派生自基类System MulticastDelegate的类 System MulticastDelegate又派生自基类System Delegate 委托举例 委托的使用定义好委托后 就可以创建它的一个实例 usingSystem delegateintMyDelegate 声明一个委托 注意声明的位置publicclassMyClass publicintInstanceMethod 非静态的方法 注意方法为int类型 无参数 Console WriteLine 调用了非静态的方法 return0 staticpublicintStaticMethod 静态方法 注意方法为int类型 无参数 Console WriteLine 调用了静态的方法 return0 publicclassTest staticpublicvoidMain MyClassp newMyClass 下面用new建立委托MyDelegate的实例 d中存储的是 非静态的方法InstanceMethod的地址MyDelegated newMyDelegate p InstanceMethod 参数是被委托的方法d 调用非静态方法 下面用new建立委托类MyDelegate的对象 d中存储静态的方法StaticMethod的地址d newMyDelegate MyClass StaticMethod 参数是被委托的方法d 调用静态方法 程序的输出结果是 调用了非静态的方法 调用了静态的方法 例5 9 委托的用法 5 4委托和事件 2 事件Windows操作系统把用户的动作都看作消息 C 中称作事件 例如用鼠标左键单击按钮 发出鼠标单击按钮事件 Windows操作系统负责统一管理所有的事件 把事件发送到各个运行程序 各个程序用事件函数响应事件 这种方法也叫事件驱动 C 语言使用组件编制Windows应用程序 组件本质上是类 在组件类中 预先定义了该组件能够响应的事件 以及对应的事件函数 该事件发生 将自动调用自己的事件函数 5 4委托和事件 2 事件事件和方法一样具有签名 签名包括名称和参数列表 1 事件的签名通过委托类型来定义 为事件定义委托的常用形式为 publicdelegatevoidEventHandler objectsender EventArgse EventHandler可以代表没有返回值 参数为 objectsender EventArgse 的函数 2 事件可以使用event关键字进行声明 例如 publiceventEventHandlerClick 声明一个事件Click 是代表类引用变量 3 若要引发该事件 可以定义引发该事件时要调用的方法 如下例所示 protectedvoidOnClick EventArgse Click事件发生 自动触发OnClick方法 if Click null 如果Click已委托了事件处理函数 执行这个函数Click this e 如何委托事件处理函数 可以通过 和 运算符向事件添加委托来订阅或取消对应的事件 publicclassLoginDialog Form 登录对话框类声明 ButtonOkButton ButtonCancelButton publicLoginDialog 构造函数 OkButton newButton 建立按钮对象OkButton Click代表OkButtonClick方法 注意 的使用OkButton Click newEventHandler OkButtonClick CancelButton newButton 建立按钮对象OkButtonCancelButton Click newEventHandler CancelButtonClick voidOkButtonClick objectsender EventArgse 处理OkButton Click事件的方法 voidCancelButtonClick objectsender EventArgse 处理CancelButton Click事件的方法 OkButton Click newEventHandler OkButtonClick 该语句的意义是使OkButton Click代表事件处理方法OkButtonClick 这样只要Click事件被触发 事件处理方法OkButtonClick就会被自动调用 事件举例 例5 10 事件的定义和调用方法 5 5反射 反射的用途是在程序或装配件中查找有关类型的信息 或者从装配件中读取元数据 反射包含的大多数类都在System Reflection命名空间中 常用的类 1 Type类 查找有关类型的相关信息 获取指向给定类型的Type对象有2种常用方式 1 使用C 提供的typeof关键字获取指定类型的Type对象 例如 Typet typeof double 2 调用Type类的GetType静态方法 例如 Typet Type GetType System Double 2 Assembly类在System Reflection命名空间中定义 它允许程序员访问给定装配件的元数据 Assembly类非常复杂 5 6序列化与反序列化 序列化获取对象并将其状态信息转换为可存储或可传输形式的过程 反序列化将对象还原回序列化之前的内容 序列化和反序列化是一个互逆的过程 NETFramework提供的两种序列化技术二进制序列化 可以保持类型不变 即可以在应用程序的不同调用之间保留对象的状态 XML和SOAP序列化 仅序列化公共属性和字段 不保存类型 5 6序列化与反序列化 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 特点 二进制序列化会将一个类的所有成员变量都进行序列化 包括私
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外研版七年级英语下册Module12单元测试试卷-含答案03
- 胡桃木好还是橡木好
- 第一单元 第二课 国家的结构形式2026年高三政治第一轮总复习
- 人教版高考历史一轮复习讲义-走向整体的世界(含解析)
- 老年人公卫课件
- 四川省成都市蓉城2024-2025学年高一年级下册6月期末联考英语试卷(含答案无听力)
- 人教版八年级英语下册Unit4 Why dont you talk to your parents?SectionB课后培优练(含答案)
- 2016年1月国开电大法学本科《国际法》期末纸质考试试题及答案
- 【启航初二 执笔新章】开学第一课课件
- 配网监理专业知识培训课件
- 四年级上册部编版作文教学计划
- 记者证考试复习题库汇总(含答案)
- 餐饮空间案例分析
- 第三章卫星链路设计
- 沪科版九年级物理导学案(全册)
- 计算流体力学完整课件
- 知名投资机构和投资人联系方式汇总
- 行政主管岗位职责及工作内容
- 生产安全事故应急救援演练记录
- 2023版初中化学跨学科实践活动(化学)
- 《新能源汽车驱动电机及传动技术》课程教案
评论
0/150
提交评论