1 / 19

第 4 章 面向对象编程方法

第 4 章 面向对象编程方法. 王德俊 上海交通大学继续教育学院. 第 4 章 面向对象编程方法. 4.1一个简单的程序 4.2 类和对象 4.3 类的继承、重载与多态 4.4 运算符的重载 4.5 接口及其实现 4.6 方法的委托 4.7 常用的几个类 4.8 命名空间. 4.6 方法的委托. 委托 ( delegate )是 C# 特有的功能,它也翻译为 代理、代表、指代 等。 C# 中 没有指针 的概念,但通过 委托 可以 实现 C/C++ 中 函数指针的功能 ,且比函数指针具有更强大的能力。

nishi
Download Presentation

第 4 章 面向对象编程方法

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第4章 面向对象编程方法 王德俊 上海交通大学继续教育学院

  2. 第4章 面向对象编程方法 4.1一个简单的程序 4.2 类和对象 4.3 类的继承、重载与多态 4.4 运算符的重载 4.5 接口及其实现 4.6 方法的委托 4.7 常用的几个类 4.8 命名空间

  3. 4.6 方法的委托 • 委托(delegate)是C#特有的功能,它也翻译为代理、代表、指代等。 • C#中没有指针的概念,但通过委托可以实现C/C++中函数指针的功能,且比函数指针具有更强大的能力。 • 简单地理解,方法的委托就是方法的别名(或者是方法的代理),通过委托不但可以执行方法,而且可以将方法传到其他的方法中,实现方法回调等。

  4. 4.6 方法的委托 4.6.1 一个简单的方法委托程序 4.6.2 委托类型的声明和实例化 4.6.3 委托的引用

  5. 4.6 方法的委托 4.6.1 一个简单的方法委托程序 delegatevoidMyDelegate(string s); //声明委托MyDelegate class A { publicvoidf(string msg) { Console.WriteLine(msg); } publicstaticvoidg(string msg) //静态方法 { Console.WriteLine(msg); } } class B { publicvoid h(MyDelegate m) { m("通过委托传递过来的是方法" + m.Method.Name + ",这是调用该方法输出的结果。"); } } 声明了委托MyDelegate,该委托可以与所有以参数列表为“string s”的函数相关联,即可以作为这些函数的代理。 以委托类型变量作为参数

  6. 4.6 方法的委托 4.6.1 一个简单的方法委托程序 staticvoidMain(string[] args) { MyDelegate gd = new MyDelegate(A.g); //此后,“gd”与“A.g”同等,同一函数名 A a = new A(); MyDelegate fd = new MyDelegate(a.f); //此后,“fd”与“a.f”同等,同一函数名 gd("这里是静态方法A.g()的委托gd输出的结果。"); //等效于 A.g("这里是静态方法A.g()的委托gd输出的结果。"); Console.WriteLine(""); fd("这里是对象a的方法f()的委托fd输出的结果。"); //等效于 a.f("这里是对象a的方法f()的委托fd输出的结果。"); Console.WriteLine(""); B b = new B(); b.h(fd); //通过委托将方法a.f到方法b.h中 Console.ReadKey(); }

  7. 委托的使用步骤

  8. 4.6 方法的委托 4.6.2 委托类型的声明和实例化 • 1. 委托类型的声明 • 格式如下: • 属性 修饰符delegate返回类型 委托类型名(参数列表); • 其中,属性修饰符是可选项,可选的修饰符包括new、public、internal、protected和private。参数列表和返回类型共同决定了委托类型能够关联的一组方法。

  9. 例如,下列代码声明了三种委托类型: publicdelegate void Delegate1(); public delegate int Delegate2(string s); public delegate string Delegate3(int i, int j); 委托类型Delegate3可以关联下列方法: string f(int m, int n); string g(int x, int y); 但不能关联下列方法: int f(int m, int n); string g(int x);

  10. 4.6 方法的委托 4.6.2 委托类型的声明和实例化 • 2. 委托的实例化 • 委托类型名和类名一样,都是用于创建对象。用委托类型名实例化的对象就是委托对象。委托对象的实例化格式如下: • 委托对象 = new 委托类型(关联方法); • 注意,能被委托的方法必须是在运行时为内存中已经能确定的方法,如静态方法、对象的方法,而类的非静态方法(还没有实例化)是不能委托的。

  11. 例如,下面第一条语句用于创建委托对象fd,它关联对象a的方法f();第二条语句关联类A的静态方法g():例如,下面第一条语句用于创建委托对象fd,它关联对象a的方法f();第二条语句关联类A的静态方法g(): MyDelegate fd = new MyDelegate(a.f); MyDelegate gd = new MyDelegate(A.g); 此后,fd就是a.f的委托,gd就是A.g的委托。

  12. 4.6 方法的委托 4.6.3 委托的引用 • 在创建委托对象以后,通过引用该对象可以实现对其关联方法的调用,简而言之,就是把委托对象名当作方法名来使用。 • 例如,对于定义的类C: • class C • { • publicstringfucn(int i, int j) • { • return i.ToString() + ":" + j.ToString(); • } • }

  13. 声明委托类型: • delegatestring fDelegate(int i, int j); • 然后创建C的对象a,并创建委托对象de: • C a = new C(); • fDelegate de = new fDelegate(a.fucn); //创建委托对象 • 最后通过引用委托对象de来执行对象a的方法: • string s1 = de(1, 2); • 这等价于: • string s1 = a.fucn(1, 2);

  14. 4.6 方法的委托 4.6.3 委托的引用 【例4.6】定义一个有学生类——student类,然后定义一个方法fun(),通过委托实现方法回调,使之既能求出成绩好的学生,也能求成绩差的学生。 class student { privatestring name; //姓名 privatedouble score; //成绩 publicstudent(string name, double score) //定义构造函数,以初始化姓名和成绩 { this.name = name; this.score = score; } publicvoid showInfo() //显示学生信息 { Console.WriteLine("姓名:{0},\t成绩:{1}", name, score.ToString()); }

  15. publicstatic object max(object obj1, object obj2) //求最大者(静态方法) { student st1 = (student)obj1; student st2 = (student)obj2; if (st1.score > st2.score) return st1; return st2; } publicstatic object min(object obj1, object obj2) //求最小者(静态方法) { student st1 = (student)obj1; student st2 = (student)obj2; if (st1.score > st2.score) return st2; return st1; } }

  16. 4.6 方法的委托 4.6.3 委托的引用 //声明委托类型,它可以关联静态方法student.max()和student.min() delegateobject xnDelegate(object o1, object o2); //以委托作为参数,定义方法fun(),以求st1和st2中成绩较好或较差的学生 static student fun(student st1, student st2, xnDelegate fxn) { return (student)fxn(st1, st2); }

  17. staticvoidMain(string[] args) { student[] sts = //创建学生对象数组 { new student("罗振武",90), new student("蒙舒意",100), new student("李丽",80), new student("周芷",60), new student("王惠",70), }; //创建委托对象mx,它关联静态方法student.max xnDelegate mx = new xnDelegate(student.max); //创建委托对象mn,它关联静态方法student.min xnDelegate mn = new xnDelegate(student.min);

  18. 4.6 方法的委托 4.6.3 委托的引用 student maxst, minst; maxst = minst = sts[0]; sts[0].showInfo(); //利用fun()方法求成绩最好的学生和成绩最差的学生 for (int i = 1; i < sts.Length; i++) { sts[i].showInfo(); maxst = fun(maxst, sts[i], mx); minst = fun(minst, sts[i], mn); } Console.WriteLine("-------------------------"); Console.WriteLine("成绩最好的学生:"); maxst.showInfo(); Console.WriteLine("-------------------------"); Console.WriteLine("成绩最差的学生:"); minst.showInfo(); Console.ReadKey(); } } }

  19. 4.6 方法的委托 委托类型的声明和实例化 委托的引用

More Related