让“链式调用(方法链)”更加自然一点
时间:2022-04-27
本文章向大家介绍让“链式调用(方法链)”更加自然一点,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
不论是JavaScript还是C#程序,我们已经习惯了采用如下所示的“链式调用”的方式进行编程,这样确实会使我们的程序变得很精练。
1: new Foo()
2: .UseXxx()
3: .UseZzz()
4: .UseZzz()
5: .Invoke();
采用这种链式调用方式的很多方法都是扩展方法,比如上面所示的UseXxx、UseYyy和UseXxx方法就是采用如下形式定义的扩展方法。
1: public interface IFoo
2: {
3: void Invoke();
4: }
5:
6: public class Foo : IFoo
7: {
8: public void Invoke()
9: {}
10: public void Execute()
11: {}
12: }
13:
14: public static class FooExtensions
15: {
16: public static IFoo UseXxx(this IFoo foo)
17: {
18: return foo;
19: }
20: public static IFoo UseYyy(this IFoo foo)
21: {
22: return foo;
23: }
24: public static IFoo UseZzz(this IFoo foo)
25: {
26: return foo;
27: }
28: }
到目前为止,一切都显得很完美,而且我看到绝大部分的扩展方法也是采用这种方式定义的。但是如果我们希望采用如下的方式调用Foo的Execute方法的,很明显下面这样的代码是不能通过编译的。
1: new Foo()
2: .UseXxx()
3: .UseZzz()
4: .UseZzz()
5: .Execute();
我们不得不将这段代码改写成如下的形式。改写的代码显得很丑陋,和上面这段代码相比较:第一、多声明了一个变量;第二、将一段很“流畅”的代码活生生拆分成两段;第三、在调用Execute方法是添加了一个很“生硬”的类型转换。
1: IFoo foo = new Foo()
2: .UseXxx()
3: .UseYyy()
4: .UseZzz();
5:
6: ((Foo)foo).Execute();
如果希望上面这段代码合法有效,我们的三个扩展方法应该定一个成如下的形式。
1: public static class FooExtensions
2: {
3: public static T UseXxx<T>(this T foo) where T: IFoo
4: {
5: return foo;
6: }
7: public static T UseYyy<T>(this T foo) where T : IFoo
8: {
9: return foo;
10: }
11: public static T UseZzz<T>(this T foo) where T : IFoo
12: {
13: return foo;
14: }
15: }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 理解 Node.js 的 GC 机制
- LeetCode176——第二高的薪水
- 快速学习-Saturn QuickStart
- 快速学习-开发你的作业
- 理解Spring中的IoC和DI
- 快速学习-Saturn性能测试报告
- Java源码系列1——ArrayList
- 【Kubernetes】自定义资源CRDs不支持fieldselector
- Cypress系列(48)- and() 命令详解
- Java源码系列2——HashMap
- 快速学习-Saturn Console部署
- MySQL的各种日志
- 本地机器如何访问服务器上的docker容器内的tensorboard?
- MySQL是如何实现可重复读的?
- Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?