将方法作为方法的參数 —— 理解托付

《.NET开发之美》上对于托付写到:“它们就像是一道槛儿,过了这个槛的人,认为真是太easy了,而没有过去的人每次见到托付和事件就认为心里别得慌,混身不自在。”我认为这句话就像是在说我自己一样。于是我决定好好看看关于这方面的知识。

一、托付与接口

事实上非常多时候我感觉托付所起的作用与定义一个仅仅是含有一个方法的接口全然一样的。他们实现的功能是同样的。

如果有这样一个样例:

事实上这个样例非常easy,就是定义了一个IGreeting接口,里面有一个Greetingpeople方法,EnglishGreeting和ChineseGreeting都是通过实现这个接口来显示的。

假设通过托付应该怎么样实现呢?

二、将方法作为方法的參数

刚才的功能假设正常我们会选择下面方法来实现:

        public void GreetPeople(string name, Language lang)
        {
            //做某些额外的事情,比方初始化之类。此处略
            switch (lang)
            {
                case Language.English:
                    EnglishGreeting(name);
                    break;
                case Language.Chinese:
                    ChineseGreeting(name);
                    break;
            }
        }
        public void EnglishGreeting(string name)
        {
            Console.WriteLine("Morning, " + name);
        }
        public void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好, " + name);
        }
        public enum Language//enum为枚举函数
        {
            English, Chinese
        }
        static void Main(string[] args)
        {
            GreetPeople("Jimmy Zhang", Language .English );
            Console.ReadKey();
        }

可是这个方案须要我们重复改动枚举和GreetPeople()方法。以适应新的需求。

假设你再细致想想,假如GreetPeople()方法能够接受一个參数变量。这个变量能够代表还有一个方法,当我们给这个变量赋值 EnglishGreeting的时候,它代表着 EnglsihGreeting() 这种方法;当我们给它赋值ChineseGreeting 的时候,它又代表着ChineseGreeting()方法。我们将这个參数变量命名为 MakeGreeting。那么不是能够如同给name赋值时一样,在调用 GreetPeople()方法的时候,给这个MakeGreeting 參数也赋上值么(ChineseGreeting或者EnglsihGreeting等)?然后,我们在方法体内。也能够像使用别的參数一样使用 MakeGreeting。

可是。因为MakeGreeting代表着一个方法。它的使用方式应该和它被赋的方法(比方ChineseGreeting) 是一样的,比方:MakeGreeting(name)。

依照上面的思路,

Public void EnglishGreeting(string name)

public void ChineseGreeting(string name)

string 定义了name參数所能代表的值的种类。也就是name參数的类型。

于是,托付出现了:它定义了MakeGreeting參数所能代表的方法的种类,也就是MakeGreeting參数的类型。

于是。从图中能够看出,生命了GreetingDelegate: public delegate void GreetingDelegate(string name)。而且,在greetpeople 方法中。MakeGreeting方法作为參数与name地位是一样的。代码例如以下:

 private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
        {
            MakeGreeting(name);
        }

同理,而既然托付GreetingDelegate 和 类型 string 的地位一样,都是定义了一种參数类型。那么。我是不是也能够这么使用托付?

static void Main(string[] args) {
    GreetingDelegate delegate1, delegate2;
    delegate1 = EnglishGreeting;
    delegate2 = ChineseGreeting;

    GreetPeople("Jimmy Zhang", delegate1);
        GreetPeople("张子阳", delegate2);
        Console.ReadKey();
时间: 2024-10-24 22:13:06

将方法作为方法的參数 —— 理解托付的相关文章

iOS 处理方法中的可变參数

## iOS 处理方法中的可变參数 近期写了一个自己定义的对话框的demo,想模仿系统的UIAlertView的实现方式.对处理可变參数的时候,遇到了小问题,于是谷歌了一下.写下了处理问题的方法.记录下来,以备后需. 代码实现 - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelBu

Java參数传递方式

原文:http://blog.sina.com.cn/s/blog_59ca2c2a0100qhjx.html,我作了些改动并添加了一个实例,添加对照 本文通过内存模型的方式来讨论一下Java中的參数传递. 1.基本类型參数的传递方式 这里的内存模型涉及到两种类型的内存:栈内存(stack)和堆内存(heap).基本类型作为參数传递时,传递的是这个值的拷贝. 不管你怎么改变这个拷贝,原值是不会改变的. 看下边的一段代码,然后结合内存模型来说明问题: public class ParameterT

Hadoop Ls命令添加显示条数限制參数

前言 在hadoop的FsShell命令中,预计非常多人比較经常使用的就是hadoop fs -ls,-lsr,-cat等等这种与Linux系统中差点儿一致的文件系统相关的命令.可是细致想想,这里还是有一些些的不同的.首先,从规模的本身来看,单机版的文件系统,文件数目少,内容不多,而HDFS则是一个分布式系统,里面能容纳巨大数量的文件文件夹.因此在这个前提之下,你假设任意运行ls或lsr命令,有的时候会得到恐怖的数据条数的显示记录,有的时候我们不得不通过Ctrl+C的方式中止命令.所以对于未知文

Python命令行选项參数解析策略

概述 在Python的项目开发过程中,我们有时须要为程序提供一些能够通过命令行进行调用的接口.只是,并非直接使用 command + 当前文件 就ok的,我们须要对其设置可选的各种各样的操作类型.所以,这样的情况下我们就有必要对传入的參数进行解析操作. 以下就此问题提出几种不同的解决策略.希望于你故意. 版权说明 著作权归作者全部. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Coding-Naga 发表日期: 2016年3月18日 链接:http://blog.csdn.net/

可变參数

C++中传递參数时,有时候不确定參数的数量,这时候能够使用可变參数.例如以下: 1.std::initializer_list C++11标准,使用方法类似vector,參数类型需同样.使用方法例如以下: #include <initializer_list> void  method(std::initializer_list<int> il) { for(auto i: il) { printf("%d", i) ; } } int _tmain(int a

第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数

MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输进来的參数: 由于MonkeyRunner须要依据指定的參数才干做事情,比方输入的一个须要执行的脚本. 假设确实不知道不论什么參数的话它就会进入MonkeyRunner的交互模式,事实上就是Jythong的交互模式,让用户能够边写代码边执行 启动AndroidDebugBridge: 事实上就是启动

setsockopt()使用方法(參数具体说明)

int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen); s(套接字): 指向一个打开的套接口描写叙述字level:(级别): 指定选项代码的类型.SOL_SOCKET: 基本套接口IPPROTO_IP: IPv4套接口IPPROTO_IPV6: IPv6套接口IPPROTO_TCP: TCP套接口optname(选项名): 选项名称optval(选项值): 是一个指向变量的指针 类型:整形,套接口

redirect_uri 參数错误的解决的方法

我通过java代码去获得用户的openid,一直报redirect_uri. 我页面代码的链接为: https://open.weixin.qq.com/connect/oauth2/authorize? appid=APPID& redirect_uri=ENCODE(URL)& response_type=code& scope=snsapi_base& state=state#wechat_redirect" 当中APPID为项目的appid,ENCODE(

grep命令參数及使用方法

功能说明:查找文件中符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或文件夹...] 补充说明:grep 指令用于查找内容包括指定的范本样式的文件,假设发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来.若不指定