委托 是一个类型
1.作用: 屏蔽方法名 ,灵活性动态性函数指针
2 .使用:
定义一个委托:      和一个类一样的
delegatevoid Del (int x);
或者
delegatevoid Del <T> (T x);
定一个委托变量和赋值
Main(){
Del d = obj.DoWork; 实例方法或者静态方法都可以    
}
   Del <int> g; 
    g= Goodone;
    g(3333);
3 . 尽管委托可以使用不建议用 out 参数
但建议您不要将其用于多路广播事件委托,因为您无法知道哪个委托将被调用。
4. 委托中的协变和逆变----
--- 其实函数传递的子类自动适应父类参数和返回值
5 多播 :  + - 操作符重载了 可以添加多个 , 
    MethodClass obj = new MethodClass();
        Del d1 = obj.Method1;
        Del d2 = obj.Method2;
        Del d3 = DelegateMethod;
        Del allMethodsDelegate = d1 + d2;
        allMethodsDelegate += d3;
        System.Console.WriteLine("-1-");
        allMethodsDelegate("xx");
  
委托和接口都允许-------类设计的时候-----分离----------类型声明和实现。
条件: 
任何类或结构都能继承和实现给定的接口。
可以为任何类上的方法创建委托,前提是该方法符合委托的方法签名。
目的: 
接口引用或委托可由不了解实现(动态性)该接口或委托方法的类的对象使用。
既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?
使用委托:
·                       当使用事件设计模式时。
·                       当封装静态方法可取时。
·                       当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。
·                       需要方便的组合。
A - B - c 
B –a –c 
C –b –a 
·                       当类可能需要该方法的多个实现时。
--不是override 是函数返回值相同.但是参数不同
类型 A 
Void method_a (string ); 
Void method_b(string); 
Void method_c(string); 
不同的方法名字,但是同一个方法的
使用接口:
·                       当存在一组可能被调用的相关方法时。
---   多个不同函数 , 需要
一个接口里面包含多个方法, 因为一个逻辑关系可能被调用. 所以放在一起
·                       当类只需要方法的单个实现时。
·                       当使用接口的类想要将该接口强制转换为其他接口或类类型时。
 多个接口套用
·                       当正在实现的方法链接到类的类型或标识时:例如比较方法。
使用单一方法接口而不使用委托的一个很好的示例是 IComparable 或泛型版本 IComparable(T)。IComparable声明 CompareTo 方法,该方法返回一个整数,指定相同类型的两个对象之间的小于、等于或大于关系。
IComparable可用作排序算法的基础。虽然将委托比较方法用作排序算法的基础是有效的,但是并不理想。因为进行比较的能力属于类,
而比较算法不会在运行时改变,
所以单一方法接口是理想的。