外部的类调用、委托和事件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业
基于面向对象的思想,完成高斯-克吕格投影正、 反算的程序(正算:将地理坐标【经度、纬度 按高斯投影换算成平面坐标。反算:将高斯投 影下平面坐标换算成地理坐标【经度、纬 度】 )。 要求:1)两星期内完成,到时随机找两人讲解 自己的程序。 2)可以讨论,杜绝拷贝。 3)记录到平时成绩
谢谢!
5、委托的调用
委托实例的调用列表可能包含一个或多 个方法。如果一个调用列表包含多个方 法时,当该委托被调用时, 该委托将按 照调用列表中的方法的注册顺序依次调 用每一个方法。
5、委托的调用
Public delegate void D(int i); Public class A { public static void F1(int i) { Console.WriteLine(“A.F1:”+i.toString()); } public static void F2(int i) { Console.WriteLine(“A.F2:”+i.toString()); } }
public class A
{ } public static int F1(int i){} //静态方法F1 public static int F2(int i){} //静态方法F2
public class B {
D d1= new D(A.F1); D d2=new D(A.F2); D d3=d1+d2; D d4=d3+d2+d1; D d5=d4-d2; }
D d2=new D(a.F1);
D d3 = new D(d2); }
委托的方法列表
委托实例除了在实例化时注册方法之外,还 可以通过“+”或“+=”运算符向该实例的方 法列表中注册方法,通过“-”或“-=”运算 符向实例的方法列表中移除方法。
4、委托的方法列表
public delegate int D(int i);
//omit the content
} Print -=new PrintEventHandler(myPrint);
事件
调用事件
若要引发该事件,可以定义引发该事件时要调用的方法,如下 例所示:
if(Print !=null) { Print(null,null); }
事件举例
【例】事件的定义和调用方法。
delegate void UserRequest(object sender, EventArgs e); class EventTest { public event UserRequest OnUserRequest; public void run() { while (true) { if (Console.ReadLine() == "a") { OnUserRequest(this, new EventArgs()); //产生事件 } } } }
{
public America() {
name = "america";
添加引用和命名空间、调用
添加命名空间 添加引用 static void Main(string[] args) { Country country = new China(); string name1 = country.name; Country country2 = new America(); string name2 = country2.name;
事件举例
class Program { static void Main(string[] args) { EventTest c1 = new EventTest(); c1.OnUserRequest += new UserRequest(c1.OnUserRequest); //委托实例化后绑定到事件 c1.run(); } public static void c1_OnUserRequest(object sender, EventArgs e) { //事件处理方法 Console.WriteLine("/t你触发了事件!"); } } }
外部类调用、委托、事件
主讲:城市与环境科学学院 刘鹏程
外部类调用
委托
事件
调用外部的类
新建项目,构建类库 新建主程序 添加引用、命名空间 调用方法与项目里的类相同
完成类定义
public class Country { public string name; } public class China : Country { public China() { name = "china"; } } } } public class America : Country
方法的返回类型必须和委托的返回类型相同。
方法的参数必须和委托的方法参数相同,参 数的具体名称可以不相同。
2、创建向委托注册方法
private int Add(int num1,int num2) { return(num1+num2); }
3、委托的实例化
委托实例化创建委托类型的实例,并向该实 例注册方法列表。委托类型的实例的方法列 表可以为静态方法、实例方法或者另外一个 委托实例。 NumOpe p1 = new NumOpe(c1.Add);
1、定义委托
定义委托 定义委托的语法如下: <访问修饰符> delegate 返回类型 委托 名(); delegate int NumOpe(int a,int b);
2、创建向委托注册方法
创建向委托注册方法 一个方法能够注册到某一个委托中,这个方 法的签名必须与该委托所指向的签名完全匹 配,匹配规则如下:
事件
注册或移除事件
如果需要事件执行事先指定的操作,则需要向该事件注册方 法列表。可以通过“+=”和“-=”运算符向事件添加委托来订 阅或取消对应的事件。
Print +=new PrintEventHandler(myPrint); Public void myPrint(object sender, EventArgs e) {
5、委托的调用
Public class B { static void Main() { D d1=new D(A.F1); D d2=new D(A.F2); D d3=d1+d2; D d4=d3+d2+d1; D d5=d4-d2; d1(2008); } } d2(100); d3(2009); d4(10; d5(0);
事件
事件
“事件”是当对象发生某些事情时,向其 他对象提供通知的一种方法。在C#中是 通过delegate实现的。 事件是响应用户对鼠标、键盘操作或自 动执行某个与事件关联的方法的行为。 事件和方法一样具有签名,签名包括名 称和参数列表。
事件
申明事件 1)声明事件的委托 事件的签名通过委托类型来定义,为事件定义委托的常用形式为: public delegate MyEventHandler(Object sender, EventArgs e) 事件是一种特殊的委托,包含两个参数:指示事件的“对象源”参数 和封装事件的其他任何信息的e参数。 2)申明事件本身。 事件使用event关键字进行声明,例如: public event MyEventHandler TriggerIt;
பைடு நூலகம்托的用法的例子
【例】委托的用法。
using System; namespace lesson1 { delegate int NumOpe(int a,int b); //第一步:委托声明 class Class1 { static void Main(string[] args) { Class1 c1 = new Class1(); NumOpe p1 = new NumOpe(c1.Add); //委托实例化 Console.WriteLine(p1(1,2)); //委托调用 Console.ReadLine(); } private int Add(int num1,int num2) { return(num1+num2); } } }
}
委托
委托
类似与C++中的函数指针,不同的是C++语言的函数 指针只能够指向静态的方法,而委托除了可以指向 静态的方法之外,还可以指向对象实例的方法。 可以将“委托”理解为“方法的抽象”,也就是说 定义一个方法的模板,至于这个方法具体是怎么样 的,就由方法自己去实现。 定义和使用委托分三个步骤: 1、委托声明。2、委托实例化。3、委托列表。 4、委托调用。
3、委托实例化
public delegate int D(int i);
Public class A
{ public int F1(int i) { }
public static int F2(int j) { }
} Public class B
{
D d1=new D(A.F2); A a=new A();