第八讲 面向对象编程(四)接口和委托.ppt_第1页
第八讲 面向对象编程(四)接口和委托.ppt_第2页
第八讲 面向对象编程(四)接口和委托.ppt_第3页
第八讲 面向对象编程(四)接口和委托.ppt_第4页
第八讲 面向对象编程(四)接口和委托.ppt_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

第八讲面向对象编程 四 接口和委托 5 4接口 接口的概念 接口是一种引用类型 类似于抽象类 主要用来定义一些必须实现的功能 一旦定义了一个接口 而且定义了一个实现这个接口的类 使用这些类的用户就可以完成接口定义的功能 多重继承是指一个子类可以有一个以上的直接父类 C 并不支持多重继承 而是用接口实现比多重继承更强的功能 5 4 1接口的概念和接口的声明 1 接口的概念 接口的作用 1 可以实现不同类的相同行为 不需要考虑类之间的层次关系 2 可以指明多个类需要实现的方法 3 可以使处于不同层次甚至互不相关的类具有相同的行为 程序员可以把用于完成特定功能的若干功能成员组织成相对独立的集合 接口 凡是需要实现这种特定功能的类都可以继承这个集合 接口 并在类内使用它 例如 String类和Double类分别表示字符串和实数 它们有一个共同特点即可以与其他对象比较大小 这时就将相关方法CompareTo集合到一个Icompare接口中 而在String类和Double类中都实现了这个接口即实现了比较的功能 假设有类Airplane Bird Superman 这些类之间并没有继承关系也不一定处于相同的层次上 但他们可以拥有共同的方法takeoff fly land 那就可以定义一个接口Ifly 接口中有三个方法成员 上述三个类都可以继承自该接口 即他们都有相同的三个方法 Ifly takeoff fly land Airplane takeoff fly land Bird takeoff fly land Superman takeoff fly land Vehicle Animal 2 接口声明 要声明一个接口必须用到interface关键字 声明一个接口的一般形式如下 属性 修饰符 interface接口的名称 基接口列表 语句 例子 interfaceIShowInfo intx get set voidShowInfo 在接口中包含的属性和方法仅仅是一个声明 在接口中不能包含它们的实现 在C 中的接口成员隐含是public 不能再加除new之外的其他修饰符 接口本身可以带修饰符 5 4 2接口的实现 声明了一个接口只是定义了一些功能 或者说定义了要完成一些功能的契约 要使用这个功能 还必须用类来实现这个接口 而且可以用一个类来实现多个接口 usingSystem interfaceINumber intx get set classNumber INumber privateintmyx publicNumber intx myx x publicintx 对接口中属性X的实现 get returnmyx set myx value 接口的实现举例 classAppMain privatestaticvoidWriteX INumberp Console WriteLine x 0 p x publicstaticvoidMain Numberp newNumber 1 WriteX p stringstr Console ReadLine 接口的多重继承 接口可以从一个或多个父接口中继承 格式如下 interfaceMyinterface Ibase1 Ibase2 接口由类来实现时 格式如下 class类名 父类 接口1 接口2 接口n 父类必须放在最前面 一个类如果实现了某个接口则要求在该类中能找到与该接口各个成员相对应的成员 即接口中的成员在类中都必须实现 可以从父类继承过来 类只能有一个父类但可以实现多个接口 实际上实现了多重继承 多个父接口中同名现象处理 interfaceIlist intCount get set interfaceIcount voidCount inti interfaceIListCount IList Icount classc voidTest IListCountx x Count 2 x Count 1 程序出错 Count不明确 此时可以通过强制类型转换来明确地指定 Ilist x Count 1 ICount x Count 2 5 4 3显式接口成员实现 接口映射 usingSystem interfaceITest voidtest1 voidtest2 在接口的实现中 还有一种实现方式叫做显式接口成员实现 意思就是在实现一个接口成员的时候 要使用完全限定名 即要求同时使用接口的名称和接口成员的名称 使用显式接口成员实现的成员不能通过类的完全限定名访问而只能用接口的实例来访问 classTest ITest voidITest test1 显式方式实现方法 Console WriteLine publicvoidtest2 普通方式实现方法 Console WriteLine classAppMain publicstaticvoidMain Testt newTest 生成一个Test类的实例ITestit t 生成一个接口的实例it test1 用接口的实例来调用方法test1t test2 用实现类的实例方法来调用test2stringstr Console ReadLine 接口的映射 接口映射就是查找接口的成员到底是在类的什么地方实现的 一般而言查找的过程如下 1 要在C中查找I X实现 如果C中已经包含了和I X相匹配的显式接口成员实现 就可以找到 2 如果没有匹配的显式接口成员实现 那么查找C中所有的非静态公共成员 如果找到和I X匹配的 也可以找到 3 如果在前两步没有找到 就在C的基类中继续重复以上的查找 直到找到为止 如果没有找到就会出错 接口映射的几个特例 例一 interfaceITest objecttest classc ITest objestITest test publicobjesttest 显式接口成员实现具有最高优先级 所以c的ITest test将成为接口中test方法的实现 例二 interfaceIControl voidPrint interfaceIForm voidPrint classPage IControl IForm publicvoidPrint 两个接口的Print方法都被映射到类Page的Print了 5 4 4接口的继承 如果在一个类中实现了接口 那么这个类的派生类就可以继承这个接口的实现 可以在派生类中隐藏基类中的实现 但并不能改变基类中的实现向接口的映射关系 5 5指代与事件 指代又可称为代理或委托 作用相当于C中的函数指针 即一个指代对应于一个方法 基本形式 属性修饰符delegate返回类型指代名称 形式参数列表 如 delegatevoidMydelegate inti 声明了一个指代 返回类型为空 参数类型为int 5 5 1指代的使用方式 指代举例 delegatevoidMydelegate inti classAppMain publicstaticvoidMain Mydelegatemd newMydelegate DelegatePara 将指代对应方法DelegatePara md 21 md已经成为方法DelegatePara的指代CallDelegate md 将指代md作为方法的参数publicstaticvoidDelegatePara inti Console WriteLine 0 i publicstaticvoidCallDelegate Mydelegatea a 21 指代对应不同的方法 usingSystem delegatevoidMydelegate publicclassMyclass publicvoidMethod1 Console WriteLine 方法一 publicvoidMethod2 Console WriteLine 方法二 publicclassMainclass staticvoidMain Myclassp newMyclass Mydelegated newMydelegate p Method1 d d newMydelegate p method2 d 5 5 3指代作为算符 usingSystem publicclassAddFunc publicstaticvoidAdd intf ints intresult f s publicclassUseAdd protectedintfirst protectedintsecond publicdelegatevoidMydelegate intfirst intsecond publicMydelegatema publicUseAdd intf ints this first f this second s publicvoidInvoke if ma null ma first second publicclassAppMain staticvoidMain 生成一个类实例UseAddp newUseAdd 12 15 生成一个指代实例 对应于AddFunc Add方法p ma newUseAdd MyDelegate AddFunc Add 调用指代方法p Invoke 在该例中的指代实现是 的运算 指代的组合 几个指代组合在一起 组成一个链 当这个链上调用一个方法时 其他的指代也会被调用 组合后的指代实际上是对多个方法的包装 对这样的指代的调用实际上是对所包装的各个方法的全部调用 指代中的方法称为调用列表 5 5 4指代的组合 指代可以用 进行调用列表的合并 可以用 进行调用列表的移除 也可以使用 和 运算符 指代如果为空 则结果为null 调用时将产生NullReferenceException异常 所以在调用一个指代之前应该检查它是否为空 usingSystem delegatevoidMydelegate strings classMyclass publicstaticvoidFirst strings Console WriteLine First 0 s publicstaitcvoidSecond strings Console WriteLine Second 0 s publicstaticvoidThird strings Console WriteLine Third 0 s publicstaticvoidMain Mydelegatea b c d a newMydelegate First b newMydelegate Second c newMydelegate Third d a b c a beijing b shanghai c hangzhou d chongqing 事件是在指代的基础上实现的一种通知机制 比如一个按纽的双击就是一个事件 这个事件的发生可以通知相关的程序进行处理 事件的工作过程为 关心某个事件的对象向能发出事件的对象进行事件处理程序的注册 当事件发生时 会调用所有注册的事件处理程序 事件处理程序要用指代来表示 事件就是指代实例 声明一个事件的方式 修饰符event指代类型名事件名如 publicdelegatevoidMydelegate eventMydelegateMyEvent 5 6事件 事件的注册与移除 事件注册是要告诉事件的发出者需要通知的对象 事件注册的实质就是向指代的调用列表中添加方法 事件注册要使用 运算符 如 事件名 指代实例 事件名 new指代类名 方法名 事件注册的移除则用 运算符事件名 指代实例 事件名 new指代类名 方法 事件的发生和应用 事件的发生 就是对事件对应的指代的调用 也就是指代的调用列表中所包含的方法的调用 格式为 事件名 参数 事件典型应用中 指代的格式为delegatevoid指代名 objectsender EventArgse 指代中的两个参数分别表示事件的发出者及事件发生时的一些参数 声明指代publicdelegatevoidEventHandler objectsender EventArgse publiceventEventHandlerClick 声明事件publicvoidOnClick EventArgse 调用事件 if Click null Click this e usingSystem namespaceConsoleApplication1 publicclassEventClass publicdelegatevoidMydelegate publi

温馨提示

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

评论

0/150

提交评论