积极答复者
C# 委托问题

问题
-
class Mammal
{
}
class Dog:Mammal
{
}
class Program{
public delegate Mammal HandlerMethod();
public static Mammal FirtHandler() {
return null;
}
public static Dog SecondHandler() {
return null;
}
static void Main() {
HandlerMethod handler1=new HandlerMethod(FirtHandler);
HandlerMethod handler2=new HandlerMethod(SecondHandler);
}
}
委托申明 delegate Mammal HandlerMethod(); 是Mammal 类,
在 HandlerMethod handler2=new HandlerMethod(SecondHandler);
为什么可以怎么用,不会出错吗??
Dog继承Mammal,Dog能实现Mammal里所有的成员 而 Dog 还可能有自己的额外属性和方法委托是Mammal 类,SecondHandler 返回值不一定是 Mammal 里的成员,委托会认得SecondHander吗?
真不理解这个过程是怎么会事??
答案
-
你的返回值是父类Mammal,Dog肯定是该类的子类。子类转化成父类当然可以无条件转化。子类一定包含父类全部成分,而且拥有自己独立成分。因此转化成父类并且获取父类的成分是毫无疑问正确的。
If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer
Help by clicking:
Click here to donate your rice to the poor
Click to Donate
Click to feed Dogs & Cats- 已建议为答案 Mike FengModerator 2013年4月8日 0:51
- 已标记为答案 Mike FengModerator 2013年5月4日 14:19
-
这涉及到委托的逆变和协变
委托是类型安全的,你上面举的例子就是协变,
对于函数 Dog SecondHandler() 赋值给 delegate Mammal HandlerMethod()
是安全的,因为Dog是Mammal的子类
如果Mammal FirtHandler() 赋值给delegate Dog HandlerMethod()是非安全的,是不行的
还有逆变
对于函数 void FirtHandler(Mammal) 赋值给delegate void HandlerMethod(Dog)就是逆变,安全的
而void FirtHandler(Dog)赋值给delegate void HandlerMethod(Mammal)是非安全的,是不行的
具体看文章http://www.2cto.com/kf/201206/136883.html 讲的非常清楚
- 已编辑 halftone1860 2013年4月19日 7:49
- 已标记为答案 Mike FengModerator 2013年5月4日 14:19
全部回复
-
你的返回值是父类Mammal,Dog肯定是该类的子类。子类转化成父类当然可以无条件转化。子类一定包含父类全部成分,而且拥有自己独立成分。因此转化成父类并且获取父类的成分是毫无疑问正确的。
If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer
Help by clicking:
Click here to donate your rice to the poor
Click to Donate
Click to feed Dogs & Cats- 已建议为答案 Mike FengModerator 2013年4月8日 0:51
- 已标记为答案 Mike FengModerator 2013年5月4日 14:19
-
这涉及到委托的逆变和协变
委托是类型安全的,你上面举的例子就是协变,
对于函数 Dog SecondHandler() 赋值给 delegate Mammal HandlerMethod()
是安全的,因为Dog是Mammal的子类
如果Mammal FirtHandler() 赋值给delegate Dog HandlerMethod()是非安全的,是不行的
还有逆变
对于函数 void FirtHandler(Mammal) 赋值给delegate void HandlerMethod(Dog)就是逆变,安全的
而void FirtHandler(Dog)赋值给delegate void HandlerMethod(Mammal)是非安全的,是不行的
具体看文章http://www.2cto.com/kf/201206/136883.html 讲的非常清楚
- 已编辑 halftone1860 2013年4月19日 7:49
- 已标记为答案 Mike FengModerator 2013年5月4日 14:19