C#之委托协变



PanPen120在CSDN上原创,如其他网站转载请注意排版和写明出处:

今天一直在研究委托,因为有函数指针的基础,还容易上手,但是对于一些概念和实践,总是为了弄的非常清楚而纠结,这几篇关于委托的文章我是结合《C#与.NET4高级程序设计》、MSDN、借鉴其他人的博文来总结话语,以最直接简洁的话来阐述清楚(在我弄懂之前网上的感觉都很模糊)

namespace DelegateCovariance
{
    class A
    {
        public int str = 1;
        public void aa() { Console.WriteLine("A"); }
    }

    class B : A
    {
        public int str = 2;
        public void aa() { Console.WriteLine("B"); }
    }

    class Program
    {
        public delegate A HandlerMethod();

        private static A s1() { return new A(); }

        private static B s2() { return new B(); }

        static void Main(string[] args)
        {

            HandlerMethod tt = new HandlerMethod(s1);

            A t1 = tt();
            Console.WriteLine("{0}", t1);

            HandlerMethod tt2 = new HandlerMethod(s2);
            A t2 = tt2();
            Console.WriteLine("{0}", t2);

            Console.ReadLine();
        }
    }
}

//试验本段代码只需拷贝代替原Progarm.cs中的内容(除去using部分)

//协变(宽松委托):

//              目的:构建一个委托类型,能指向返回类及继承体系的方法

//                      -----就是只需要构建一个返回值是父类的委托,类和派生类同时使用的委托方法

//              用法:1.委托类型是返回值是父类

//                     例如:public delegate A HandlerMethod();

//                    2.委托的对象传入的是返回父类(或子类)对象的方法(这也是和委托类型对应了)

//                     例如:private static A s1() { return new A(); }

//                           HandlerMethod tt = new HandlerMethod(s1);

//                    3.调用父类(或子类)成员则将传统=后面new的部分换成对应的委托对象(对应:委托对象接收传入的方法是返回是哪个类的对象)

//                     例如:private static A s1() { return new A(); }

//                           HandlerMethod tt = new HandlerMethod(s1);

//                           A t1 = tt();

时间: 2024-11-09 10:55:47

C#之委托协变的相关文章

[转载]C#深入分析委托与事件

原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 引言 本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Deleg

C#综合揭秘——深入分析委托与事件

本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单.在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用.最后一节,将介绍Predicate<T>.Action<T>.Func<T,TResult>多种泛型委托的使用和Lamb

.NET可变性解析(协变和逆变)

[一]何为可变性 可变性是.NET4.0中的一个新特性,可变性可分为 : 协变性.逆变性.不可变性. 那么在.NET4.0之前是否有可变性? 答案是肯定的,我们可以通过下面的几个实例来简单的了解一下.NET4.0之前的协变和逆变. 实例 1 : 方法参数的协变 static void Main(string[] args) { GetProject(new Course()); // Course 继承自 Project 此处进行了协变 } static void GetProject(Proj

委托基础详解

/*委托是一个类型安全的对象        * 它指向程序中另一个以后被调用的方法或多个方法.委托类型包含3个重要的信息:        * 1:它所调用的方法的名称        * 2:该方法的参数(可选)        * 3:该方法的返回值(可选)        * 注:.net委托既可以指向静态方法,也可以指向实例方法        *         * 当一个委托对象被创建并提供了上述信息后,它可以在运行时动态调用其他指向的方法,可以看到 .Net Framework 中每个委托(

9、委托、事件、Lambda

关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.) 第二个问题,委托和C++(其实起源于C语言)函数指针? 必然要说区别,虽然委托和函数指针都是指向以后要调用的方法.但委托相比于函数指针来说,主要有两点优势:一,委托是对象(我们知道,委托和类在一个层次).二,委托是内置支持多路广播和异步方法调用的. 关于事件. 问题,事件用来干什么? 事件是为委托服务的,它使得

C#中的泛型

.泛型 在C#中可以用<>占位符,来进行类型占位.由于泛型占位在编译之后就会被替换成对应的类型,所有可以重用,比object性能要好很多.但有一个不算太大的缺点:泛型占位在编译时必须确定类型(传入或编译器推断). 泛型类  1.1 泛型类中占位符的几种约束 a.基类约束 pulic class Hourse<T> where T:Pig 只能传入Pig类型             b.接口约束 pulic class Hourse1<T> where T:IPig 只能

快速理解C#中的委托与事件

以下内容只是个人理解,仅供参考. 什么是委托? 先看最简单的委托例子: namespace DelegateTest { public delegate void MessageDelegate(string name); class Program { private static void SaySomething(string name) { Console.WriteLine("You said " + name); } static void Main(string[] ar

C#复习笔记(3)--C#2:解决C#1的问题(进入快速通道的委托)

委托 前言:C#1中就已经有了委托的概念,但是其繁杂的用法并没有引起开发者太多的关注,在C#2中,进行了一些编译器上的优化,可以用匿名方法来创建一个委托.同时,还支持的方法组和委托的转换.顺便的,C#2中增加了委托的协变和逆变. 方法组转换 方法组这个词的含义来自于方法的重载:我们可以定义一堆方法,这堆方法的名称都一样,但是接受的参数不同或者返回类型不同(总之就是签名不同----除了名字),这就是方法的重载. public static void SomeMethod(object hellow

编写高质量代码改善C#程序的157个建议——建议44:理解委托中的协变

建议44:理解委托中的协变 委托中的泛型变量天然是部分支持协变的.为什么是“部分支持协变”?看下面示例: class Program { public delegate T GetEmployeeHanlder<T>(string name); static void Main() { GetEmployeeHanlder<Employee> getAEmployee = GetAManager; Employee e = getAEmployee("Mike"