第 4 章 面向对象编程方法
DESCRIPTION
第 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++ 中 函数指针的功能 ,且比函数指针具有更强大的能力。 - PowerPoint PPT PresentationTRANSCRIPT
第第 44 章 面向对象编程方法章 面向对象编程方法
王德俊
上海交通大学继续教育学院
应用软件开发( C# ) 第 4 章 面向对象编程方法
第第 44 章 面向对象编程方法章 面向对象编程方法
4.1一个简单的程序
4.2 类和对象
4.3 类的继承、重载与多态
4.4 运算符的重载
4.5 接口及其实现
4.6 方法的委托
4.7 常用的几个类
4.8 命名空间
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
委托( delegate )是 C# 特有的功能,它也翻译为代理、代表、指代等。
C# 中没有指针的概念,但通过委托可以实现 C/C++ 中函数指针的功能,且比函数指针具有更强大的能力。
简单地理解,方法的委托就是方法的别名(或者是方法的代理),通过委托不但可以执行方法,而且可以将方法传到其他的方法中,实现方法回调等。
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
4.6.1 一个简单的方法委托程序
4.6.2 委托类型的声明和实例化
4.6.3 委托的引用
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
4.6.1 一个简单的方法委托程序
delegate void MyDelegate(string s); // 声明委托MyDelegate class A { public void f(string msg) { Console.WriteLine(msg); } public static void g(string msg) // 静态方法 { Console.WriteLine(msg); } } class B { public void h(MyDelegate m) { m(" 通过委托传递过来的是方法 " + m.Method.Name + " ,这是调用该方法输出的结果。 "); } }
声明了委托MyDelegate, 该委托可以与所有以参数列表为“ string s” 的函数相关联,即可以作为这些函数的代理。
以委托类型变量作为参数
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
4.6.1 一个简单的方法委托程序static void Main(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(); }
应用软件开发( C# ) 第 4 章 面向对象编程方法
委托的使用步骤
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
4.6.2 委托类型的声明和实例化
1. 委托类型的声明
格式如下:
属性 修饰符 delegate 返回类型 委托类型名 ( 参数列表 );
其中,属性修饰符是可选项,可选的修饰符包括new、 public、 internal、 protected和 private 。参数列表和返回类型共同决定了委托类型能够关联的一组方法。
应用软件开发( C# ) 第 4 章 面向对象编程方法
例如,下列代码声明了三种委托类型:public delegate 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);
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
4.6.2 委托类型的声明和实例化
2. 委托的实例化委托类型名和类名一样,都是用于创建对象。用委托类型名
实例化的对象就是委托对象。委托对象的实例化格式如下: 委托对象 = new 委托类型 ( 关联方法 );
注意,能被委托的方法必须是在运行时为内存中已经能确定的方法,如静态方法、对象的方法,而类的非静态方法(还没有实例化)是不能委托的。
应用软件开发( C# ) 第 4 章 面向对象编程方法
例如,下面第一条语句用于创建委托对象 fd ,它关联对象 a的方法 f() ;第二条语句关联类 A 的静态方法 g() :
MyDelegate fd = new MyDelegate(a.f); MyDelegate gd = new MyDelegate(A.g);
此后, fd 就是 a.f 的委托, gd 就是 A.g 的委托。
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
4.6.3 委托的引用
在创建委托对象以后,通过引用该对象可以实现对其关联方法的调用,简而言之,就是把委托对象名当作方法名来使用。
例如,对于定义的类 C :class C{
public string fucn(int i, int j){
return i.ToString() + ":" + j.ToString();}
}
应用软件开发( C# ) 第 4 章 面向对象编程方法
声明委托类型:delegate string 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);
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
4.6.3 委托的引用【例 4.6】 定义一个有学生类—— student 类,然后定义一个方法fun() ,通过委托实现方法回调,使之既能求出成绩好的学生,也能求成绩差的学生。
class student { private string name; // 姓名 private double score; // 成绩 public student(string name, double score) //定义构造函数,以初始化姓名和成绩 { this.name = name; this.score = score; } public void showInfo() // 显示学生信息 { Console.WriteLine(" 姓名: {0}, \t 成绩:{1}", name, score.ToString()); }
应用软件开发( C# ) 第 4 章 面向对象编程方法
public static object max(object obj1, object obj2) // 求最大者(静态方法) { student st1 = (student)obj1; student st2 = (student)obj2; if (st1.score > st2.score) return st1; return st2; } public static object min(object obj1, object obj2) // 求最小者(静态方法) { student st1 = (student)obj1; student st2 = (student)obj2; if (st1.score > st2.score) return st2; return st1; } }
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
4.6.3 委托的引用
// 声明委托类型,它可以关联静态方法 student.max()和student.min()delegate object xnDelegate(object o1, object o2); // 以委托作为参数,定义方法 fun() ,以求 st1和 st2 中成绩较好或较差的学生 static student fun(student st1, student st2, xnDelegate fxn) { return (student)fxn(st1, st2); }
应用软件开发( C# ) 第 4 章 面向对象编程方法
static void Main(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);
应用软件开发( C# ) 第 4 章 面向对象编程方法
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(); } }}
应用软件开发( C# ) 第 4 章 面向对象编程方法
4.6 方法的委托
委托类型的声明和实例化
委托的引用