none
C# 委托问题 RRS feed

  • 问题

  • 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吗?
    真不理解这个过程是怎么会事??
    2013年4月7日 6:46

答案

  • 你的返回值是父类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

    2013年4月7日 6:53
    版主
  • 这涉及到委托的逆变和协变

    委托是类型安全的,你上面举的例子就是协变,

    对于函数 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  讲的非常清楚




    2013年4月19日 7:47

全部回复

  • 你的返回值是父类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

    2013年4月7日 6:53
    版主
  • 这涉及到委托的逆变和协变

    委托是类型安全的,你上面举的例子就是协变,

    对于函数 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  讲的非常清楚




    2013年4月19日 7:47