1
using System;
2
namespace uu
3
{
4
public class Delegates
5
{
6
public static void Main()
7
{
8
long length;
9
long width;
10
long height;
11
Console.Write("请输入长度:");
12
length=long.Parse(Console.ReadLine());
13
Console.Write("请输入宽度");
14
width=long.Parse(Console.ReadLine());
15
Console.Write("请输入高度");
16
height=long.Parse(Console.ReadLine());
17
GGResult myGetResult=new GGResult(height,length,width);
18
Measure myMeasure=new Measure();
19
GGResult.MyDelegate myGRdelegate;
20
if(length==width)
21
{
22
myGRdelegate=new GGResult.MyDelegate(myMeasure.MeasureSquare);//提示要参数
23
}
24
else
25
{
26
myGRdelegate=new GGResult.MyDelegate(myMeasure.MeasureRectangle);//提示要参数
27
}
28
myGetResult.Calc(myGRdelegate);
29
Console.ReadLine();
30
}
31
}
32
//GGResult类
33
public class GGResult
34
{
35
long height;
36
long width;
37
long length;
38
public GGResult(long height,long width,long length)
39
{
40
this.height=height;
41
this.width=width;
42
this.length=length;
43
}
44
public delegate double MyDelegate(long length,long width);//声明委托
45
public void Calc(MyDelegate pmydelegate)
46
{
47
double volume;
48
volume=pmydelegate(length,width)*height;
49
Console.WriteLine("高度为{0}则体积为{1}",height,volume);
50
}
51
}
52
//Measure类
53
public class Measure
54
{
55
public double MeasureSquare(long length,long width)
56
{
57
double squareLength;
58
double squareSurface;
59
squareLength=4*length;
60
squareSurface=Math.Pow(length,2);
61
Console.WriteLine("长为{0}宽为{1}的正方的周长为{2},面积为{3}",length,width,squareLength,squareSurface);
62
return squareSurface;
63
}
64
public double MeasureRectangle(long length,long width)
65
{
66
double RectangleLength;
67
double RectangleSurface;
68
RectangleLength=2*(length+width);
69
RectangleSurface=length*width;
70
Console.WriteLine("长为{0}宽为{1}的长方形的周长为{2},面结为{3}:",length,width,RectangleLength,RectangleSurface);
71
return RectangleSurface;
72
}
73
}
74
}
委派相当于一个容器,而这个容器使用来存放函数的或者说是用来封装函数的,而这个容器又可以看成一个函数,这个函数没有![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
31
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
73
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
74
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
实现方法,只需要返回类型和参数与姚封装的函数一致就可以了,那么就可以封装这个函数了。
例如上面的例子:
1,声明了一个double型的委派myDelegate,参数为(long length,long width);那么此委派只能封装就有返回值且是double,而且
参数为long的函数。
2,在Measure类中,有两个方法,MeasureSquare和MeasureRectangle,这两个函数都具有反回值是double型的,参数也是long
型的。所以这两个函数都可以分装到委派里面。
3,上面说到,委派相当于一个函数,既然是函数,那么也就可以有参数和返回值(当然了要和所封装的函数一致)。
1,在GGResult类中有一个方法Calc;它的参数为委派类型的参数,实际上是调用了委派所封装的方法,根据条件来初始化
myDelegate所封装的方法,然后把这个方法通过参数的形式传送到Cale中,然后再Calc中调用这个方法。
大概一看此程序没有什么可看的,其实不然,简单的看一下似乎没有问题,但仔细一想问题就出来了
myDelegate=new GGResult.MyDelegate(myMeasure.MeasureSquare);
myDelegate=new GGResult.MyDelegate(myMeasure.MeasureRectangle);
这两句是初始化了委派即说明了委派来封装那个函数,并不是执行语句。那么什么时候开始执行这个委派呢?
在 myGetResult.Calc(myGRdelegate);这句中,因为在Calc中有这么一句
volume=pmydelegate(length,width)*height;
所以在执行pmydelegate时就开始执行了上面的其中一个委派中的方法。
那么参数从何而来?答案就是:在初始化GGResult时就把参数初始化到GGResult的构造函数中了,然后调用pmydelegate时
就直接调用了。
注意:在类中声明函数时,如果函数没有static关键字时,那么可以通过类的实例来引用,如果有static关键字时,只能用
类名直接引用。
类中类的初始化:
在GGResult中声明了一个委派类MyDelegate那么在初始化时必须加上GGResult
既GGResult.MyDelegate 实例名字=new GGResult.MyDelegate();