黑马程序员技术交流社区

标题: 泛型、委托?? [打印本页]

作者: LiangLiu    时间: 2013-4-27 20:59
标题: 泛型、委托??
泛型   委托  学习视频看过了,还是不理解,谁能给具体讲解一下,使用场合、使用方法?具体什么作用,最好有代码.
作者: 许庭洲    时间: 2013-4-28 22:30
1.在 AddHead 方法中作为方法参数的类型;
2.在 Node 嵌套类中作为公共方法 GetNext 和 Data 属性的返回类型;
3.在嵌套类中作为私有成员数据的类型;
使用泛型 GenericList<T> 类来创建整数列表。只需更改类型参数,即可方便地修改下面的代码示例,创建字符串或任何其他自定义类型的列表:
class TestGenericList
{
    static void Main()
    {
        // int is the type argument
        GenericList<int> list = new GenericList<int>();
        for (int x = 0; x < 10; x++)
        {
            list.AddHead(x);
        }
        foreach (int i in list)
        {
            System.Console.Write(i + " ");
        }
        System.Console.WriteLine("\nDone");
    }
}
作者: cowthan    时间: 2013-4-28 23:22
泛型:你要实现一个类,MyList,作用是存放对象,但是存放什么类型的对象?你设计的时候不知道,只有别人用的时候才知道,所以你使用泛型设计这个类,表示我给你一个类,里面能放很多对象,具体什么类型?我不知道,但是你知道,所以你用具体的类型代替我的泛型就行。

代理:你要设计一个窗口类,上面有一个按钮,按钮被点击的时候能够调用某个action函数,但是action具体执行什么呢,你不知道,但是使用这个类的人知道,所以你用代理来代替action,表示这里我知道这里会执行一个动作,我这就放个代理,具体你要执行什么动作,你自己设置一下这个代理就行。

具体代码由于没有.net运行环境,所以就不写了,看楼上楼下
作者: 崔宏奎    时间: 2013-4-29 00:38
1.泛型的使用真的是一大改革,比如我写一个交换两个int型变量的函数,应该这样写:
  1. void swapint(ref int a,ref int b)
  2. {
  3.     int temp=a;
  4.     a=b;
  5.     b=temp;
  6. }
复制代码
但仔细想一下,如果哪天我又想交换两个double型变量怎么办,重新写一个swapdouble吗?有了泛型,问题解决了,我只需要这样:
  1. void swap<T> (ref T a, ref T b)
  2. {
  3.    T temp=a;
  4.    a=b;
  5.    b=temp;
  6. }
复制代码
现在我想交换两个数的时候,就不需要管它是Int型、Double型还是string、TimeSpan了,编译器会帮我解决这个问题,我只需调用swap<int>(ref x,ref y)、swap<double>(ref a,ref b)、甚至直接写swap(ref a, ref b)都可以了。

2.委托,委托我理解的就是一个函数指针(可以理解为,泛型得表示一类函数,这类函数有相同的参数,返回值),比如我写了四个函数,分别是加、减、乘、除、
  1. int Add(int a,int b){return a+b;}
  2. int Sub(int a,int b){return a-b;}
  3. int Mul(int a,int b){return a*b;}
  4. int Div(int a,int b){return a/b;}
复制代码
你会发现,这四个函数都使用了两个参数,而且返回的都是int类型。
现在假设我又写了一个函数,来完成比较复杂的运算,比如这样
  1. int Calc(int x, int y)
  2. {
  3.      ........(处理了一些奇怪的东西)
  4.      int n;
  5.      ........(一些奇奇怪怪的运算)
  6.      return n;
  7. }
复制代码
比如这个函数的作用是获得用户的输入,判断一下进行加减还是乘除运算,最后输出n的值。
这个时候,问题出现了,我不确定到底要调用之前写的加减乘除中的哪个函数,需要在函数中指定,那么就可以用委托。
  1. delegate int Mydel (int a,int b);
  2. int Calc(int x, int y)
  3. {
  4. Mydel  del;  //把Mydel看作一种类型(实际是一个类)
  5. ........(处理了一些奇怪的东西)
  6. int n=5;
  7. ........(一些奇奇怪怪的运算)
  8. if (xxx==yyy)
  9. {
  10. del=Add;   //委托添加一个方法,就用Add函数
  11. del+=Div; //又加了一个方法
  12. }
  13. int sum=del(n,4);  //调用这个委托
  14. return   sum;  // sum 是经过Add(n,4);再经过Div(n,4)后得到的值
  15. }
复制代码
这样,是不是方便了许多,代码可读性也会好一些。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2