白话“委托的使用”

关于委托的使用,长期以来一直令人困惑。很多书籍上的解释,不是似是而非,就是只讲语法,难以令人信服。

委托形似方法。如果我们就委托来说方法,是一个永远也解不开的扣。

委托实例时,接受一个方法,来帮助我们处理事情。那为什么不直接使用方法呢?如同,我们叫大管家张三通知仆人李四去买醋,那为什么我们不直接通知仆人李四呢?

有人说,当有n个仆人时(n个方法)供我们选择时,这样代码清楚,效率高。但我想,只是这样的理由,那不足以发明委托这个对象。

个人认为:

如果我们告诉大管家需要买醋时,我们还没有雇到仆人,连大管家都不知道该找谁去买时,这个逻辑就成立了;也就是说,当我们定义委托时,它所接受的方法,根本就不存在,也没有地方去找。但是,代码还要编下去,并且,这个方法的实现有可能是非常复杂的,没有规律可循的。

举个例子:

public class 旅游

{

    public delegate int 到北京的时间();

}

 

public interface I来自天津
    {
        int 天津();

     }

public interface I来自海南
    {
        int 海南();

     }

public interface I来自纽约
    {
        int 纽约();

     }

public class 去北京:旅游,I来自天津,I来自海南,I来自纽约

{

    int 天津()

    {

        汽车n小时;

    }

    int 海南()

    {

        汽车n小时 + 飞机n小时

    }

    int 纽约()

    {

        汽车n小时 + 轮船n小时 + 火车n小时

    }

 

    static void Main(string[] args)
    {
        到北京的时间 d = new 到北京的时间( "方法名" );

        int s = d();

        Console.WriteLine(s);

     }

}

 

这是自己对委托这个对象的认知,用白话来给于诠释。但自己心中也没有实底,欢迎大家讨论!

 

抱歉!有朋友说上面代码看不懂,这是由于上面的代码只是逻辑说明,没有严格的推导,故重写一个可以运行的程序来说明:(大家可以试一试)

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    //--------------------------------------------------------------------------------------
    public class 基类
    {
        public static string sName;             // 声明字段

        public delegate string 委托();          // 声明委托

        public static string 你是谁( 委托 d )   // 定义方法,将委托作为参数
        {
            sName = d();   // 关键理解:获取委托的签名,相当于获取那个未知方法的签名!

            return sName;                       // 返回参数
        }

        public static void 告诉你()             // 定义方法
        {
            Console.WriteLine( sName );         // 显示

            Console.Read();
        }
    }

    // 注意:因为委托接受的方法没有定义,所以将委托做为一个方法的签名,可以使程序可以继续编下去。

    //--------------------------------------------------------------------------------------
    class 子类: 基类
    {       
        public static string 仆人()             // 在子类中定义,委托将要接受的方法
        {
            return "我叫李四,来自子类";
        }

        static void Main(string[] args)
        {
            委托 d = new 委托( 子类.仆人 );     // 实例委托

            你是谁( d );                        // 将委托传入方法

            告诉你();                           //
        }
    }

    //--------------------------------------------------------------------------------------
}

posted @   hxmhj  阅读(2277)  评论(27编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示