C#面向对象编程(四)接口和委托.ppt

上传人:qwe****56 文档编号:70007665 上传时间:2023-01-14 格式:PPT 页数:26 大小:279.50KB
返回 下载 相关 举报
C#面向对象编程(四)接口和委托.ppt_第1页
第1页 / 共26页
C#面向对象编程(四)接口和委托.ppt_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《C#面向对象编程(四)接口和委托.ppt》由会员分享,可在线阅读,更多相关《C#面向对象编程(四)接口和委托.ppt(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C#面向对象编程(四)接口和委托 berry博客:n 5.4 5.4 接口接口接口的概念:接口是一种引用类型,类似于抽象类,主要用来定义一些必须实现的功能。一旦定义了一个接口,而且定义了一个实现这个接口的类,使用这些类的用户就可以完成接口定义的功能。多重继承是指一个子类可以有一个以上的直接父类,C#并不支持多重继承,而是用接口实现比多重继承更强的功能。5.4.15.4.1 接口的概念和接口的声明接口的概念和接口的声明1.1.接口的概念接口的概念接口的作用:(1)可以实现不同类的相同行为,不需要考虑类之间的层次关系;(2)可以指明多个类需要实现的方法;(3)可以使处于不同层次甚至互不相关的类具有

2、相同的行为。程序员可以把用于完成特定功能的若干功能成员组织成相对独立的集合(接口),凡是需要实现这种特定功能的类都可以继承这个集合(接口)并在类内使用它。例如:String类和Double类分别表示字符串和实数,它们有一个共同特点即可以与其他对象比较大小,这时就将相关方法CompareTo集合到一个Icompare接口中,而在String类和Double类中都实现了这个接口即实现了比较的功能。假设有类Airplane,Bird,Superman,这些类之间并没有继承关系也不一定处于相同的层次上,但他们可以拥有共同的方法takeoff()、fly()、land()。那就可以定义一个接口Ifly,

3、接口中有三个方法成员,上述三个类都可以继承自该接口,即他们都有相同的三个方法。Ifly:takeoff();fly();land();Airplane:takeoff();fly();land();.Bird:takeoff();fly();land();Superman:takeoff();fly();land();Vehicle:Animal:2.2.接口声明接口声明要声明一个接口必须用到interface关键字,声明一个接口的一般形式如下:属性 修饰符 interface 接口的名称 :基接口列表 /语句 例子:interface IShowInfo int x get;set;void

4、 ShowInfo();在接口中包含的属性和方法仅仅是一个声明,在接口中不能包含它们的实现,在C#中的接口成员隐含是public,不能再加除new之外的其他修饰符。接口本身可以带修饰符。5.4.2 5.4.2 接口的实现接口的实现声明了一个接口只是定义了一些功能,或者说定义了要完成一些功能的契约,要使用这个功能,还必须用类来实现这个接口,而且可以用一个类来实现多个接口。using System;interface INumber int x get;set;class Number:INumber private int myx;public Number(int x)myx=x;public

5、 int x /对接口中属性对接口中属性X的实现的实现 get return myx;set myx=value;接口的实现举例接口的实现举例class AppMain()private static void WriteX(INumber p)Console.WriteLine(“x=0”,p.x);public static void Main()Number p=new Number(1);WriteX(p);string str=Console.ReadLine();*接口的多重继承接口的多重继承接口可以从一个或多个父接口中继承,格式如下:interface Myinterface:I

6、base1,Ibase2.接口由类来实现时,格式如下:class 类名:父类,接口1,接口2,.,接口n.父类必须放在最前面,一个类如果实现了某个接口则要求在该类中能找到与该接口各个成员相对应的成员,即接口中的成员在类中都必须实现(可以从父类继承过来)。类只能有一个父类但可以实现多个接口,实际上实现了多重继承。多个父接口中同名现象处理多个父接口中同名现象处理interface Ilist int Count get;set;)interface Icount void Count(int i);interface IListCount:IList,Icount class c void Tes

7、t(IListCount x)x.Count(2);x.Count=1;程序出错,Count不明确;此时可以通过强制类型转换来明确地指定。(Ilist)x).Count=1;(ICount)x).Count(2);5.4.3 5.4.3 显式接口成员实现(接口映射)显式接口成员实现(接口映射)using System;interface ITest void test1();void test2();在接口的实现中,还有一种实现方式叫做显式接口成员实现。意思就是在实现一个接口成员的时候,要使用完全限定名,即要求 同时使用接口的名称和接口成员的名称。使用显式接口成员实现的成员不能通过类的完全限定

8、名访问而只能用接口的实例来访问。class Test:ITest void ITest.test1()/显式方式实现方法 Console.WriteLine(“”);public void test2()/普通方式实现方法 Console.WriteLine(“”);class AppMain()public static void Main()Test t=new Test();/生成一个Test类的实例 ITest it=t;/生成一个接口的实例 it.test1();/用接口的实例来调用方法test1 t.test2();/用实现类的实例方法来调用test2 string str=Con

9、sole.ReadLine();接口的映射接口的映射接口映射就是查找接口的成员到底是在类的什么地方实现的,一般而言查找的过程如下:(1)要在C中查找I.X实现,如果C中已经包含了和I.X 相匹配的显式接口成员实现,就可以找到。(2)如果没有匹配的显式接口成员实现,那么查找C中所有的非静态公共成员,如果找到和I.X匹配的,也可以找到。(3)如果在前两步没有找到,就在C的基类中继续重复以上的查找,直到找到为止,如果没有找到就会出错。接口映射的几个特例接口映射的几个特例例一、interface ITest object test();class c:ITest objest ITest.test()

10、.public objest test().显式接口成员实现具有最高优先级,所以c的ITest.test将成为接口中test方法的实现。例二、interface IControl void Print();interface IForm void Print();class Page:IControl,IForm public void Print().两个接口的Print方法都被映射到类Page的Print了。5.4.4 5.4.4 接口的继承接口的继承如果在一个类中实现了接口,那么这个类的派生类就可以继承这个接口的实现。可以在派生类中隐藏基类中的实现,但并不能改变基类中的实现向接口的映射关

11、系。n5.5 5.5 指代与事件指代与事件指代又可称为代理或委托,作用相当于C中的函数指针,即一个指代对应于一个方法。基本形式:属性 修饰符 delegate 返回类型 指代名称(形式参数列表)如:delegate void Mydelegate(int i);声明了一个指代,返回类型为空,参数类型为int 5.5.1 5.5.1 指代的使用方式指代的使用方式指代举例指代举例delegate void Mydelegate(int i);class AppMain()public static void Main()Mydelegate md=new Mydelegate(DelegatePa

12、ra);/将指代对应方法DelegatePara()md(21);/md已经成为方法DelegatePara的指代 CallDelegate(md);/将指代md作为方法的参数 public static void DelegatePara(int i)Console.WriteLine(“0”,i);public static void CallDelegate(Mydelegate a)a(21);指代对应不同的方法指代对应不同的方法using System;delegate void Mydelegate();public class Myclass public void Method

13、1()Console.WriteLine(“方法一”);public void Method2()Console.WriteLine(“方法二”);public class Mainclass static void Main()Myclass p=new Myclass();Mydelegate d=new Mydelegate(p.Method1);d();d=new Mydelegate(p.method2);d();5.5.3 指代作为算符指代作为算符using System;public class AddFunc public static void Add(int f,int s

14、)int result=f+s;public class UseAdd protected int first;protected int second;public delegate void Mydelegate(int first,int second);public Mydelegate ma;public UseAdd(int f,int s)this.first=f;this.second=s;public void Invoke()if(ma!=null)ma(first,second);public class AppMain()static void Main()/生成一个类

15、实例 UseAdd p=new UseAdd(12,15);/生成一个指代实例,对应于AddFunc.Add方法 p.ma=new UseAdd.MyDelegate(AddFunc.Add);/调用指代方法 p.Invoke();在该例中的指代实现是在该例中的指代实现是“+”的运算。的运算。指代的组合:几个指代组合在一起,组成一个链,当这个链上指代的组合:几个指代组合在一起,组成一个链,当这个链上指代的组合:几个指代组合在一起,组成一个链,当这个链上指代的组合:几个指代组合在一起,组成一个链,当这个链上调用一个方法时,其他的指代也会被调用。调用一个方法时,其他的指代也会被调用。调用一个方法时

16、,其他的指代也会被调用。调用一个方法时,其他的指代也会被调用。组合后的指代实际上是对多个方法的包装,对这样的指代的调组合后的指代实际上是对多个方法的包装,对这样的指代的调组合后的指代实际上是对多个方法的包装,对这样的指代的调组合后的指代实际上是对多个方法的包装,对这样的指代的调用实际上是对所包装的各个方法的全部调用,指代中的方法称用实际上是对所包装的各个方法的全部调用,指代中的方法称用实际上是对所包装的各个方法的全部调用,指代中的方法称用实际上是对所包装的各个方法的全部调用,指代中的方法称为调用列表。为调用列表。为调用列表。为调用列表。5.5.4 5.5.4 指代的组合指代的组合指代可以用指代

17、可以用指代可以用指代可以用+进行调用列表的合并,可以用进行调用列表的合并,可以用进行调用列表的合并,可以用进行调用列表的合并,可以用-进行调用列表的移进行调用列表的移进行调用列表的移进行调用列表的移除,也可以使用除,也可以使用除,也可以使用除,也可以使用+=+=和和和和-=-=运算符。运算符。运算符。运算符。指代如果为空,则结果为指代如果为空,则结果为指代如果为空,则结果为指代如果为空,则结果为nullnull,调用时将产生,调用时将产生,调用时将产生,调用时将产生NullReferenceExceptionNullReferenceException异常,所以在调用一个指代之前应该异常,所以

18、在调用一个指代之前应该异常,所以在调用一个指代之前应该异常,所以在调用一个指代之前应该检查它是否为空。检查它是否为空。检查它是否为空。检查它是否为空。using System;delegate void Mydelegate(string s);class Myclass public static void First(string s)Console.WriteLine(“First 0”,s);public staitc void Second(string s)Console.WriteLine(“Second 0”,s);public static void Third(string

19、 s)Console.WriteLine(“Third 0”,s);public static void Main()Mydelegate a,b,c,d;a=new Mydelegate(First);b=new Mydelegate(Second);c=new Mydelegate(Third);d=a+b+c;a(“beijing”);b(“shanghai”);c(“hangzhou”);d(“chongqing”);事件是在指代的基础上实现的一种通知机制,比如一个按纽的双击就是一个事件,这个事件的发生可以通知相关的程序进行处理。事件的工作过程为:关心某个事件的对象向能发出事件的对象进

20、行事件处理程序的注册;当事件发生时,会调用所有注册的事件处理程序。事件处理程序要用指代来表示,事件就是指代实例。声明一个事件的方式:修饰符 event 指代类型名 事件名如:public delegate void Mydelegate();event Mydelegate MyEvent;5.6 5.6 事件事件事件的注册与移除事件的注册与移除事件注册是要告诉事件的发出者需要通知的对象。事件注册的实质就是向指代的调用列表中添加方法。事件注册要使用+=运算符。如:事件名+=指代实例;事件名+=new 指代类名(方法名);事件注册的移除则用运算符事件名指代实例;事件名new 指代类名(方法);事

21、件的发生和应用事件的发生和应用事件的发生,就是对事件对应的指代的调用,也就是指代的调用列表中所包含的方法的调用。格式为:事件名(参数);事件典型应用中,指代的格式为delegate void 指代名(object sender,EventArgs e);指代中的两个参数分别表示事件的发出者及事件发生时的一些参数。/声明指代public delegate void EventHandler(object sender,EventArgs e);public event EventHandler Click;/声明事件public void OnClick(EventArgs e)/调用事件 if

22、(Click!=null)Click(this,e);using System;namespace ConsoleApplication1public class EventClasspublic delegate void Mydelegate();public event Mydelegate MyEvent;public void OnEvent()if(MyEvent!=null)MyEvent();public class AppMain public static void f()Console.WriteLine(事件发生时调用F方法);public static void Main()EventClass md=new EventClass();md.MyEvent+=new ConsoleApplication1.EventClass.Mydelegate(f);md.OnEvent();string str=Console.ReadLine();

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

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁