委托 是一个类型
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可用作排序算法的基础。虽然将委托比较方法用作排序算法的基础是有效的,但是并不理想。因为进行比较的能力属于类,
而比较算法不会在运行时改变,
所以单一方法接口是理想的。