C#程序设计大学教程(罗兵)第六至十一章_第1页
C#程序设计大学教程(罗兵)第六至十一章_第2页
C#程序设计大学教程(罗兵)第六至十一章_第3页
C#程序设计大学教程(罗兵)第六至十一章_第4页
C#程序设计大学教程(罗兵)第六至十一章_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京理工大学珠海学院孙细斌 C 程序设计 第6章C 面向对象编程深入 北京理工大学珠海学院孙细斌 学习目标 掌握集合的创建和使用 System Collections 掌握接口的定义和使用了解迭代器的实现原理掌握委托 代理 的创建和使用掌握事件的定义和使用掌握匿名方法的定义及应用 北京理工大学珠海学院孙细斌 6 1集合 Collection命名空间中定义了几种数据结构 有列表 ArrayList 队列 Queue 栈 Stack 和哈希表 Hashtable 集合类都实现了ICollection IEnumerable和Icloneable接口 北京理工大学珠海学院孙细斌 1 ArrayList类 ArrayList类提供了一个特定的数据结构 其行为上像数组 但其容量可按照需要增长 克服了数组的主要缺点 即在实例化数组时 必须知道数组的大小 北京理工大学珠海学院孙细斌 2 Queue类 Queue类实现了一种先进先出的数据结构 把对象放进一个等待队列中 一端插入 另一端移除 北京理工大学珠海学院孙细斌 3 Stack类 Stack类实现了一种后进先出的数据结构 栈 Stack one two three 进栈 出栈 北京理工大学珠海学院孙细斌 4 Hashtable类 Hashtable类创建哈希表实现的数据结构支持在键对象和值对象之间建立联系 哈希桶2 北京理工大学珠海学院孙细斌 思考 定义了一个汽车类Automobile类 其中有一个方法MoveForward 现要实现小轿车Car类又要实现蚂蚁Ant类 蚂蚁 接口IMoveable 北京理工大学珠海学院孙细斌 6 2接口 6 2 1定义接口接口是引用类型规则 实现一个接口的类必须精确地按照该接口的定义来实现该接口的各个成员 接口成员包括 方法 属性 索引器和事件 为这些接口成员提供实现的过程称为 实现 接口 包括隐式实现和显示实现 类可以同时继承多个接口 北京理工大学珠海学院孙细斌 6 2 1定义接口 声明接口的语法 interface接口名 base list 示例 interfaceICarnivore boolIsHungry get set AnimalHunt voidEat Animalvictim 北京理工大学珠海学院孙细斌 6 2 1定义接口 所有的接口成员 都不能包含访问修饰符 所有成员都隐式地声明为public 在接口中定义的属性和索引可以有一个抽象的get访问器 或者一个抽象的set访问器 或者二者兼有 接口的定义很像类或结构 它定义了类必须实现的行为类型的特征 最终还是需要由类来实现 北京理工大学珠海学院孙细斌 6 2 1定义接口 尽管可以继承接口的实现 但是接口本身在发布后就不能更改了 若要增强接口的功能 就必须创建新接口 需要使用接口继承而不是类继承的情况 1 当程序需要许多彼此无关的对象类型来提供特定功能时 更适合使用接口 2 接口比基类更灵活 可以定义实现多个接口的单个实现 4 若不需要从基类继承实现 可选择接口 北京理工大学珠海学院孙细斌 6 2 2实现接口 接口本身并不包含任何实现代码 最终的实现要由派生类来完成 6 2 2 1隐式实现和直接由基类产生派生类的方式很相似 北京理工大学珠海学院孙细斌 publicclassLion ICarnivore privateboolhungry publicboolIsHungry get returnhungry publicAnimalHunt publicvoidEat Animalvictim 北京理工大学珠海学院孙细斌 6 2 2 2显示实现接口 在继承了多个接口时 可能会有不同的接口其定义的方法名相同 类中实现时就会出现二义性了 为了避免这种二义性 必须在声明中加上接口名 北京理工大学珠海学院孙细斌 interfaceICarnivore boolIsHungry get AnimalHunt voidEat Animalvictim interfaceIHerbivore boolIsHungry get voidGatherFood 北京理工大学珠海学院孙细斌 6 2 3如何使用实现了某接口的对象 可以使用is和as关键字来确定对象是否实现了某接口 示例 定义了以下几个类 publicclassChimpanzee Animal IHerbivore ICarnivore publicclassLion Animal ICarnivore publicclassAntelope Animal IHerbivore publicclassElephant Animal IHerbivore 北京理工大学珠海学院孙细斌 6 2 3如何使用实现了某接口的对象 判断对象是否实现了某个特定接口 foreach AnimalsomeAnimalinzoo if someAnimalisIHerbivore IHerbivoreveggie IHerbivore someAnimal veggie GatherFood 可以把对象类型强制转换为接口类型 北京理工大学珠海学院孙细斌 6 2 3如何使用实现了某接口的对象 上述代码中 执行is操作符时 执行了检查someAnimal对象类型的操作 然后在强制类型转换时 将再次进行检查 这样就进行了两次检查 所以C 提供了as操作符 避免两次检查 as操作符把检查操作和强制类型转换操作结合在一起 北京理工大学珠海学院孙细斌 示例 foreach AnimalsomeAnimalinzoo IHerbivoreveggie someAnimalasIHerbivore if veggie null veggie GatherFood 北京理工大学珠海学院孙细斌 6 2 3如何使用实现了某接口的对象 is和as操作符也适用于其他类型 publicvoidEat Animalprey if preyisAntelope Console WriteLine Favoritemeal elseConsole WriteLine Lionisn thungry 北京理工大学珠海学院孙细斌 6 2 4多个接口的继承 类可以继承多个接口 接口也可以继承一个或多个接口 1 继承多个接口格式 classChimpanzee Animal ICarnivore IHerbivore Chimpanzee类必须实现ICarnivore和IHerbivore接口的所有成员 2 继承接口的接口接口继承接口与类的继承类似 例 interfaceICarnivore boolIsHungry get voidEat interfaceIHerbivore boolIsHungry get voidGatherFood interfaceIOmnivore IHerbivore ICarnivore voidDecideWhereToGoForDinner 北京理工大学珠海学院孙细斌 6 2 5接口与抽象类的比较 抽象类是一种不能实例化的类 可以部分实现 接口是一个完全抽象的成员集 完全留给开发者来实现 抽象类为管理组件版本提供了简单易行的方法 而接口在创建后就不能再更改 北京理工大学珠海学院孙细斌 6 2 5接口与抽象类的比较 北京理工大学珠海学院孙细斌 6 2 6接口和 NET框架 在 NET框架中 许多地方都用到了接口 通过实现合适的接口 可以增强类的可用性 System Collections命名空间中的类对接口进行了扩展应用 集合类中使用的接口 北京理工大学珠海学院孙细斌 所有的数组都可以用foreach语句遍历 因为数组都继承了类库中的System Array类 该类又继承了IEnumerable接口 在C 中 某个类型是可枚举的 就是指该类型继承了接口IEnumerable 或泛型接口IEnumerable 或泛型接口IEnumerable的任何一个构造类型 Foreach循环中的迭代 北京理工大学珠海学院孙细斌 6 4代理 委托 例子 在一个拥有多种降温设备 例如 电力空调 干冰降温机 气动降温机等 的生物实验室里 因为要完成某项试验 要求室内温度低于某个临界温度值 需要设计一个控制用的软件系统 在适当的时候启用适当的降温设备来控制室内温度的升高 北京理工大学珠海学院孙细斌 可以尝试采用下面这两种方式来实现 软件驱动各个降温设备经常地测量室内温度 根据温度变化 各个降温设备自动启用 另外编写一个监视室内温度的模块 当温度变化时 就启动合适的降温设备 北京理工大学珠海学院孙细斌 publicclassElectricEquipment publicvoidStartElectricEquipment 电力空调启动方法 publicclassDryIceEquipment publicvoidOpenDIEquipment 干冰降温机启动方法 publicclassTemperatureMonitor privateArrayListEquipments newArrayList publicvoidAdd objectEquipment Equipments Add Equipment publicvoidStartAllEquipment foreach ObjectEquipmentinEquipments if EquipmentisElectricEquipment ElectricEquipment Equipment StartElectricEquipment if EquipmentisDryIceEquipment DryIceEquipment Equipment OpenDIEquipment publicclassUseTempMonitor publicstaticvoidMain TemperatureMonitortempMon newTemperatureMonitor ElectricEquimenteel newnewElectricEquipment tempMon Add eel DryIceEquimentdel newnewDryIceEquipment tempMon Add del tempMon StartAllEquipment 北京理工大学珠海学院孙细斌 publicvoidStartElectricEquipment publicvoidOpenDIEquipment 北京理工大学珠海学院孙细斌 6 4 1委托的概念 委托 到底是什么意思 委托是一种从委托类 Delegate类 中派生出来的数据结构 它包含了对方法的引用 类似于方法的定义 但没有方法体 当程序必须通过调用一个方法来执行某个操作 但在编译时不知道该方法具体是什么时 就可以使用委托来实现 委托允许在程序运行时指定调用的方法 北京理工大学珠海学院孙细斌 6 4 2委托的创建 1 声明委托类型委托规定了每个方法都必须具有的特定返回类型和参数 即委托签名 修饰符 delegate返回类型委托名称 参数列表 示例 delegatedoubleMathsDelegateType doublex doubley 北京理工大学珠海学院孙细斌 6 4 2委托的创建 2 实例化委托在声明了委托类型之后 就可以创建委托对象并把委托对象与特定的方法联系起来 通过委托对象调用的方法必须和委托具有同样的签名 即返回类型和参数要一致 示例 MathsOperations类具有一个Add方法 classMathsOperations publicdoubleAdd doublex doubley returnx y 北京理工大学珠海学院孙细斌 实例化该类 MathsOperationsmath newMathsOperations 创建一个委托实例 MathsDelegateTypemathsDelegate mathsDelegate newMathsDelegateType math Add 6 4 2委托的创建 北京理工大学珠海学院孙细斌 6 4 2委托的创建 3 通过委托对象调用方法上例中 当调用mathsDelegate时 实际就是调用math Add方法 而无需知道所引用的对象所属的类 mathsDelegate 10 5 北京理工大学珠海学院孙细斌 6 4 2委托的创建 创建和调用委托 1 声明委托并提供一个签名 该签名要与委托将要调用的方法的签名一致 2 创建一个委托实例 该委托指向具有合适签名的方法3 通过委托对象调用方法 北京理工大学珠海学院孙细斌 6 4 2委托的创建 1 publicdelegatevoidNameEventHandler objectsender NameEventArgse publicvoidbutton Click objectsender NameEventArgse 2 NameEventHandleraDelegate newNameEventHandler button Click 3 aDelegate button e 北京理工大学珠海学院孙细斌 6 4 3综合实例1 首先定义了一个类MathsOperations 包括两个静态方法 然后使用委托调用这些方法 classMathsOperations publicstaticdoubleMultiplyByTwo doublevalue returnvalue 2 publicstaticdoubleSquare doublevalue returnvalue value 如何用委托来引用该方法 classProgram staticvoidMain string args Console ReadKey delegatedoubleDoubleOp doublex DoubleOpoperations newDoubleOp MathsOperations MultiplyByTwo doubleresult operations 3 0 Console WriteLine 3 0的运算结果是 result 北京理工大学珠海学院孙细斌 staticvoidProcessAndDisplayNumber DoubleOpaction doublevalue doubleresult action value Console WriteLine Valueis 0 resultofoperationis 1 value result 方法的引用 作为参数 北京理工大学珠海学院孙细斌 6 4 5多重代理 多播委托 在前面的示例中 一个委托对象可以指向一个方法 委托对象能否同时指向多个方法呢 多播委托 可使用委托调用多个方法 也称为多重代理 委托可以维护一个方法列表 然后依次调用列表中的方法 语法 DelegateTyped1 d2 d3 可用 操作符添加方法 用 操作符移除方法 北京理工大学珠海学院孙细斌 6 4 5多重代理 多播委托 例如 myClass d1 newDelegateType myMethod d1 newDelegateType myMethod 修改上例2 北京理工大学珠海学院孙细斌 6 4 5多重代理 多播委托 修改上例1 classMathsOperations publicstaticvoidMultiplyByTwo doublevalue doubleresult value 2 Console WriteLine Multiplyingby2 0 gives 1 value result publicstaticvoidSquare doublevalue doubleresult value value Console WriteLine Squaring 0 gives 1 value result 北京理工大学珠海学院孙细斌 6 4 5多重代理 多播委托 使用多播委托 可以按顺序连续调用多个方法 委托的签名必须返回void 北京理工大学珠海学院孙细斌 6 5事件 Windows的应用程序和web应用程序都是基于事件驱动的应用程序 即根据事件来执行代码 6 5 1事件的定义及实现事件是能够在代码中对其进行响应 或处理 的操作 1 定义格式 modifiers eventtypename 委托类型 以 On 开头 北京理工大学珠海学院孙细斌 E g publicdelegatevoidAnimalCollectionHandler Animala publiceventAnimalCollectionHandlerOnAnimalReadyForCollection 2 订阅事件hospital OnAnimalReadyForCollection newMedicalCenter AnimalCollectionHandler this ReleasedNotification 北京理工大学珠海学院孙细斌 3 事件处理方法的实现 publicvoidReleasedNotification Animala 方法体 4 事件的触发if OnAnimalReadyForCollection null 调用事件处理程序OnAnimalReadyForCollection a 北京理工大学珠海学院孙细斌 事件综合示例 当释放一个动物时 动物园医疗中心想要使管理员收到一个事件本示例用到两个类MedicalCenter和ZooKeeper MedicalCenter类定义了一个事件 当释放一个动物时 ZooKeeper类必须收到通知 北京理工大学珠海学院孙细斌 6 5 2事件类型 对象可以引发很多事件类型键盘事件 鼠标事件和属性事件是最常用的事件 在基于windows应用程序中 常会编写鼠标和键盘事件 如MouseDown MouseMove KeyPress KeyDown等 属性事件是在属性更改时发生 北京理工大学珠海学院孙细斌 6 5 3事件处理程序的编写 委托适合于事件处理 在C 中 事件处理也正是通过委托来实现的 1 委托与事件处理程序通过使用委托 NET框架事件模型把事

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论