delegate——委派

 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}
委派相当于一个容器,而这个容器使用来存放函数的或者说是用来封装函数的,而这个容器又可以看成一个函数,这个函数没有
   实现方法,只需要返回类型和参数与姚封装的函数一致就可以了,那么就可以封装这个函数了。
   例如上面的例子:
   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();

你可能感兴趣的:(delegate)