委托—可扩展

其实研究了半天,最后发现其实不管什么最终的目的就是解耦和,可扩展。

对于委托来说,用一句最直接的话来说,就是代替了if-else(switch)语句。举例:

class Program
        {
            //定义一个枚举,作为判断的依据
            public enum Language
            {
                 English, Chinese
            }
//两种语言问候的方法
 public void EnglishGreeting(string name)
            {
                Console.WriteLine("Morning, " + name);
            }
            public void ChineseGreeting(string name)
            {
               Console.WriteLine("早上好 ," + name);
            }
//GreetPeople执行选择语言的方法
 public void GreetPeople(string name, Language lang)
            {
              switch (lang)
              {
                   case Language.English:
                        EnglishGreeting(name);
                       break;
                   case Language.Chinese:
                       ChineseGreeting(name);
                        break;
               }
            }

主函数:

//主函数显示问候语
  static void Main(string[] args)
            {
                GreetPeople("huohuo", EnglishGreeting);
                GreetPeople("霍霍", ChineseGreeting);
                Console.ReadKey();

而当我们再加几种语言的问候语的时候,为了避免循环语句的出现,以及对枚举类型改动

违背的原则:OOP中的OCP(对扩展开放,对修改关闭)原则。于是:

我们引用了“委托”的概念,对于上个问候的小例子,我们可以这样来考虑:

增加一个GreetingManager来封装一下:

 //定义委托,它定义了可以代表的方法的类型。
    public delegate void GreetingDelegate(string name);

    public class GreetingManager
    {
        public GreetingDelegate delegate1;
        public void GreetPeople(string name)
        {
            if (delegate1 != null)
            {
                delegate1(name);
                //MakeGreeting(name);
            }
        }

对于委托是用静态方法来修饰的:

 public static void EnglishGreeting(string name)
            {
                Console.WriteLine("Morning, " + name);
            }
            public static void ChineseGreeting(string name)
            {
                Console.WriteLine("早上好 ," + name);
            }

主函数直接调用的结果:

 GreetingManager gm = new GreetingManager();

                gm.delegate1 = EnglishGreeting;
                gm.delegate1 += ChineseGreeting;

                gm.GreetPeople("huohuo");

例子看完了,现在我们来了解一下,

什么是委托?

  • 委托是一个类,它定义了方法的类型,使得可以将方法作为一个方法的参数来进行传递(也就是将方法作为方法的参数);

  • 类是对象的抽象,而委托是函数的抽象;
  • 一个委托代表了具有相同参数列表和返回值的所有函数;

为什么要用委托?

  • 相当于用方法作为另一方法参数,避免在程序中大量的使用If-else(Switch)语句,也就是刚开始所列举的例子;
  • 使程序具有更好的可扩展性,满足OCP原则;
  • 在两个不能直接调用的方法中作为桥梁,如:在多线程中的跨线程的方法调用就得用委托;

对于委托,其实也只是了解的这点而已,好处也只是明白了前两点,对于第三点的实践等待验证。

时间: 2024-10-10 17:03:41

委托—可扩展的相关文章

Func<>委托、扩展方法、yield、linq ForEach综合运用

1.先定义一个Model类    public class P1    {        public string name { get; set; }        public int age { get; set; }    }    2.定义一个扩展方法    作用:用于处理集合数据,通过传入一个委托来实现    注意,扩展方法必须定义在静态类中,而且方法本身也是静态的.    public static class ExtendMethod    {        public st

[转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委托是一个类型,是一个函数指针类型,这个类型将该委托的实例化对象所能指向的函数的细节封装起来了,即规定了所能指向的函数的签名,也就是限制了所能指向的函数的参数和返回值.当实例化委托的时候,委托对象会指向某一个匹配的函数,实质就是将函数的地址赋值给了该委托的对象,然后就可以通过该委托对象来调用所指向的函

7、面向对象以及winform的简单运用(委托)

委托 1.概念: 委托可以看成是一个函数的“容器”,将某一具体的函数“装入”后,就可以把它当成函数一样使用.委托变量可看成是一种类型安全的函数指针,它只能接收符合其要求的函数地址. 2.定义方法:delegate关键字.例: public delegate int MyDele(int a, int b); 3.利用委托调用函数 1)首先定义一个类,里面写几个方法: class Class1 { public int Jiafa(int a, int b) { return a + b; } p

.NET 扩展方法 (二)

上一篇随笔 .NET 扩展方法 (一) 已经对 扩展方法有了大致的介绍,这篇算是一个补充,让我们来看一下扩展方法的几个细节: 一.扩展方法具有继承性 当使用扩展方法扩展一个类型的时候,其也扩展了派生类,所以上一篇的遗留问题“如果给object添加一个扩展方法会出现什么效果呢?” 的 答案就是——所有类型都将扩展该方法.object类已经经受住了时间的考验,我们似乎也找不到更合适的理由来扩展object类.从另外的 角度考虑,如果扩展了object类,很有可能会给“智能敏感提示”造成污染,以至于填

浅谈对C#委托理解

刚进入公司不久,就上开始项目,对一个实习生来说还是有一些压力的,初入社会,对于我这个初级程序员来说要学的东西实在太多了,公司最近在做一个winform框架开发的桌面应用程序,众所周知,winform也好,webform也好,里面随处可见的事件驱动,有事件,当然也少不了委托,感觉之前对委托这个概念的理解一直是模模糊糊的,口里都会背的那么几句话:"委托可以把方法当作参数在另一个方法中传递和调用","委托是方法的快捷方式"等等.但是真要深入理解,灵活运用,还是要有良好的代

C++实现委托机制(二)

C++实现委托机制(二) 1.引言:              上一篇文章已经介绍了如何构建一个无参数无返回值的函数指针的委托,这篇文章将对上一文章所述委托进行扩展,使得可以注册任意函数指针,不过再讲篇内容之前先要介绍一下实现这个功能所需要了解的C++11的一个新特性———可变参数模板. 2.可变参数模板:              template(模板)是源于将类型和实现(算法)分离开的思想,为了让写好的算法适用于更多类型使得出现了模板,模板使得参数类别任意化,如果再加上“参数个数的任意化”

【C#】详解使用Enumerable.Distinct方法去重

Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组.集合中的重复元素,还可以自定义去重的规则. 有两个重载方法: // // 摘要: // 通过使用默认的相等比较器对值进行比较返回序列中的非重复元素. // // 参数: // source: // 要从中移除重复元素的序列. // // 类型参数: // TSource: // source 中的元素的类型. // // 返回结果: // 一个 Syste

关于refactoring

重构让代码变得有价值而不是负担.通过时机.切入点.原则三个词语来简单了解一下重构. 什么时候我们要重构,逻辑重复.程序复杂不好理解.添加功能时不好修改. Method: 相同的代码 过长的参数 不好理解的方法名 复杂的算法 Class: 相似的method 过大的class 临时.相同的field 面向过程化 职责不清晰 纯数据class  Organizing 一个class引发多个class修改(divergent change) 一个class受多个class变化的影响(shotgun s

tomcat(8)载入器

[0]README 0.0)本文部分描述转自"深入剖析tomcat",旨在学习 tomcat(8)载入器 的基础知识: 0.1)一个标准web 应用程序中的载入器:简单来说就是 tomcat中的载入器: 0.2)servlet容器需要实现一个自定义的载入器,而不能简单地使用系统的类载入器的原因:(干货--为什么servlet容器要实现一个自定义的载入器) 0.2.1)原因1:因为servlet容器不应该完全信任它正在运行的servlet类: 0.2.2)原因2:如果使用系统类的载入器载