第 4 章 面向对象编程方法
190 likes | 395 Vues
第 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++ 中 函数指针的功能 ,且比函数指针具有更强大的能力。
第 4 章 面向对象编程方法
E N D
Presentation Transcript
第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++中函数指针的功能,且比函数指针具有更强大的能力。 • 简单地理解,方法的委托就是方法的别名(或者是方法的代理),通过委托不但可以执行方法,而且可以将方法传到其他的方法中,实现方法回调等。
4.6 方法的委托 4.6.1 一个简单的方法委托程序 4.6.2 委托类型的声明和实例化 4.6.3 委托的引用
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”的函数相关联,即可以作为这些函数的代理。 以委托类型变量作为参数
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(); }
4.6 方法的委托 4.6.2 委托类型的声明和实例化 • 1. 委托类型的声明 • 格式如下: • 属性 修饰符delegate返回类型 委托类型名(参数列表); • 其中,属性修饰符是可选项,可选的修饰符包括new、public、internal、protected和private。参数列表和返回类型共同决定了委托类型能够关联的一组方法。
例如,下列代码声明了三种委托类型: 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);
4.6 方法的委托 4.6.2 委托类型的声明和实例化 • 2. 委托的实例化 • 委托类型名和类名一样,都是用于创建对象。用委托类型名实例化的对象就是委托对象。委托对象的实例化格式如下: • 委托对象 = new 委托类型(关联方法); • 注意,能被委托的方法必须是在运行时为内存中已经能确定的方法,如静态方法、对象的方法,而类的非静态方法(还没有实例化)是不能委托的。
例如,下面第一条语句用于创建委托对象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的委托。
4.6 方法的委托 4.6.3 委托的引用 • 在创建委托对象以后,通过引用该对象可以实现对其关联方法的调用,简而言之,就是把委托对象名当作方法名来使用。 • 例如,对于定义的类C: • class C • { • publicstringfucn(int i, int j) • { • return i.ToString() + ":" + j.ToString(); • } • }
声明委托类型: • 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);
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()); }
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; } }
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); }
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);
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(); } } }
4.6 方法的委托 委托类型的声明和实例化 委托的引用