第 4 章 面向对象编程方法

19
4 4 第 第第第第第第第第 第 第第第第第第第第 王王王 王王王王王王王王王王王王

Upload: nishi

Post on 18-Jan-2016

102 views

Category:

Documents


2 download

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 Presentation

TRANSCRIPT

Page 1: 第 4 章 面向对象编程方法

第第 44 章 面向对象编程方法章 面向对象编程方法

王德俊

上海交通大学继续教育学院

Page 2: 第 4 章 面向对象编程方法

应用软件开发( C# ) 第 4 章 面向对象编程方法

第第 44 章 面向对象编程方法章 面向对象编程方法

4.1一个简单的程序

4.2 类和对象

4.3 类的继承、重载与多态

4.4 运算符的重载

4.5 接口及其实现

4.6 方法的委托

4.7 常用的几个类

4.8 命名空间

Page 3: 第 4 章 面向对象编程方法

应用软件开发( C# ) 第 4 章 面向对象编程方法

4.6 方法的委托

委托( delegate )是 C# 特有的功能,它也翻译为代理、代表、指代等。

C# 中没有指针的概念,但通过委托可以实现 C/C++ 中函数指针的功能,且比函数指针具有更强大的能力。

简单地理解,方法的委托就是方法的别名(或者是方法的代理),通过委托不但可以执行方法,而且可以将方法传到其他的方法中,实现方法回调等。

Page 4: 第 4 章 面向对象编程方法

应用软件开发( C# ) 第 4 章 面向对象编程方法

4.6 方法的委托

4.6.1 一个简单的方法委托程序

4.6.2 委托类型的声明和实例化

4.6.3 委托的引用

Page 5: 第 4 章 面向对象编程方法

应用软件开发( 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” 的函数相关联,即可以作为这些函数的代理。

以委托类型变量作为参数

Page 6: 第 4 章 面向对象编程方法

应用软件开发( 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(); }

Page 7: 第 4 章 面向对象编程方法

应用软件开发( C# ) 第 4 章 面向对象编程方法

委托的使用步骤

Page 8: 第 4 章 面向对象编程方法

应用软件开发( C# ) 第 4 章 面向对象编程方法

4.6 方法的委托

4.6.2 委托类型的声明和实例化

1. 委托类型的声明

格式如下:

属性 修饰符 delegate 返回类型 委托类型名 ( 参数列表 );

其中,属性修饰符是可选项,可选的修饰符包括new、 public、 internal、 protected和 private 。参数列表和返回类型共同决定了委托类型能够关联的一组方法。

Page 9: 第 4 章 面向对象编程方法

应用软件开发( 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);

Page 10: 第 4 章 面向对象编程方法

应用软件开发( C# ) 第 4 章 面向对象编程方法

4.6 方法的委托

4.6.2 委托类型的声明和实例化

2. 委托的实例化委托类型名和类名一样,都是用于创建对象。用委托类型名

实例化的对象就是委托对象。委托对象的实例化格式如下: 委托对象 = new 委托类型 ( 关联方法 );

注意,能被委托的方法必须是在运行时为内存中已经能确定的方法,如静态方法、对象的方法,而类的非静态方法(还没有实例化)是不能委托的。

Page 11: 第 4 章 面向对象编程方法

应用软件开发( 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 的委托。

Page 12: 第 4 章 面向对象编程方法

应用软件开发( C# ) 第 4 章 面向对象编程方法

4.6 方法的委托

4.6.3 委托的引用

在创建委托对象以后,通过引用该对象可以实现对其关联方法的调用,简而言之,就是把委托对象名当作方法名来使用。

例如,对于定义的类 C :class C{

public string fucn(int i, int j){

return i.ToString() + ":" + j.ToString();}

}

Page 13: 第 4 章 面向对象编程方法

应用软件开发( 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);

Page 14: 第 4 章 面向对象编程方法

应用软件开发( 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()); }

Page 15: 第 4 章 面向对象编程方法

应用软件开发( 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; } }

Page 16: 第 4 章 面向对象编程方法

应用软件开发( 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); }

Page 17: 第 4 章 面向对象编程方法

应用软件开发( 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);

Page 18: 第 4 章 面向对象编程方法

应用软件开发( 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(); } }}

Page 19: 第 4 章 面向对象编程方法

应用软件开发( C# ) 第 4 章 面向对象编程方法

4.6 方法的委托

委托类型的声明和实例化

委托的引用