java的回调和C#的委托
曾经有人对我说java的回调很巧妙。
今天我自己看了一下,回调的关键就是一个接口的事情。
也许是因为用了一定的手法,一开始不好懂吧,所以看懂了会感觉巧妙。
但是我心里的想法却是,真啰嗦!
回调的实例
下面是一个回调的实例,截图自网友的文章----https://www.jianshu.com/p/2cbc5232547a。

意思就是,我提前定义了CallBack接口,里面预先约定了giveMe这一行为。
然后Buyer内部有个继承自CallBack的成员,需要在一个方法中传入这个CallBack实例。
Buyer内部有个方法会做一些事情,做完了呢?就会做执行约定好的giveMe行为。
然后Me呢?通过一个匿名内部类实现了CallBack接口,Override了giveMe行为。
这样以后Buyer执行完doThing方法后,就会执行giveMe行为。
本质是什么呢?
本质是动态的替换Buyer类的giveMe行为。
这个本质是语法层面上的。
C#怎么写?

我想让GiveMe方法是活的?那我就放上一个GiveMe方法的指代物----名字也叫GiveMe。
Me想改变Buyer实例的GiveMe行为?给GiveMe这个委托赋值一下就好了。
很明显,使用委托是更加简单直接的做法,更直觉式的。
本质
大家都差不多其实,大家的本质都是一个指针。
大家都是一个【方法引用】的指针指向了【被调用的方法】。
这个本质是原理层面的。
有意思的地方
使用接口的一个好处是,抽出不一样的地方单独修改。也就是光改不一样的地方,一样的地方不修改。
所以,一些人就把多态,抽离组合当作面向对象特有的东西。
但是Java使用接口做出来的回调机制,并不能简洁的把当前例子中【每个Buyer实例的GiveMe行为是不同的】这一区别抽离出来。
java要每次多写一个类,然后重写GiveMe方法才可以。最简单的办法当然是,GiveMe不一样,那我只改GiveMe。
文档
刚才查了一下微软文档,微软文档很贴心的说明了何时应该使用委托,何时应该使用接口。
C#当然也可以使用接口来实现这一功能,但是委托好用的时候就用委托了。
下面是截图。

突然想到
今天我工作的时候就想到,很多框架对人的编码工作都是一种限制,都是强制的让人去使用这种方式而不使用另一种方式来写代码。
如果强制让人用什么框架写的话,就会写的很啰嗦。
那为什么不去除这种约束,然后大家商量出一套编码规范来呢??
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
但是回头想了下并不是这样。
就像墨菲定律说的,如果说有两种写法一种好,一种坏,一定有人会用那种坏的方法去写。
我自己也会,因为代码并不是一口气写好的,越写越多就会越来越乱。
目前人们抱怨的java的啰嗦,大部分是因为java死抱住面向对象设计而产生的,我是面向对象的,那我就用面向对象的方式去解决问题,我就有我的套路。
我java并不是死板,而是有自己的特点。
最后
java是架构师的语言,C#是程序员的语言。
C#把复杂的设计隐藏在了简单的语言特性之中;虽然完全面向对象,但不迷信面向对象;不管是函数式/声明式,只要能简化编码工作,只要好用,那我就支持上。
这是C#最有趣的地方。
java的回调和C#的委托的更多相关文章
- Java判断回文数算法简单实现
好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...
- 详解回调函数——以JS为例解读异步、回调和EventLoop
回调,是非常基本的概念,尤其在现今NodeJS诞生与蓬勃发展中变得更加被人们重视.很多朋友学NodeJS,学很久一直摸不着门道,觉得最后在用Express写Web程序,有这样的感觉只能说明没有学懂 ...
- java序列回显学习
java反序列化回显 在很多不出网的情况下,一种是写webshell(内存嘛),另一种就是回显,本文先学习回显,回显的主要方式有一下几种. defineClass RMI绑定实例 URLClassLo ...
- Java——判断回文
package basic; import java.util.Scanner; public class Palindrome{ public static boolean isPalindrome ...
- Java实现回文判断
1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有两种方法可供参考: (1)从字符串两头 ...
- 【练习】使用接口回调和handler实现数据加载到listview
代码结构 布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...
- Java 判断回文字符串有多少和其中的最大字符串
一.简介代码功能 该代码的功能可以实现对任意的一段字符串进行判断是否有回文,回文有哪些,和其中的最大回文. 二.代码部分 1.全局变量 static String hws = "" ...
- java基础——回文数判断
/** * 题目描述: * 有这样一类数字,他们顺着看和倒着看是相同的数,例如:121,656,2332等,这样的数字就称为:回文数字.编写一个函数,判断某数字是否是回文数字. * 要求实现方法: * ...
- learning java 推回输入流
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import ...
随机推荐
- 生成对抗网络(Generative Adversarial Networks,GAN)初探
1. 从纳什均衡(Nash equilibrium)说起 我们先来看看纳什均衡的经济学定义: 所谓纳什均衡,指的是参与人的这样一种策略组合,在该策略组合上,任何参与人单独改变策略都不会得到好处.换句话 ...
- Fiddler抓包工具的基本操作
Fiddler ——位于客户端和服务器端的HTTP代理 代理:客户端所有请求都先经过fiddler,然后转发到相应服务器 服务器端所有相应都先经过fiddler,然后发送到客户端 1. 常用的HTTP ...
- DRF之注册器、响应器、分页器
一.url注册器 通过DRF的视图组件,数据接口逻辑被我们优化到最剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url,使用步骤如下: 第一步:导入模块 1 from rest_f ...
- swift 实现iOS手势密码、指纹密码、faceID
本博客包含了如何实现iOS手势密码.指纹密码.faceID全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBTouchID,支持swift3. ...
- ios swift多线程的实现 Multithreading
1.多线程的概念 Multithreading多线程是指从软件或硬件上,实现多个线程并发执行的技术.使得能够同步完成多项任务,提高资源使用效率. 1.1 任务.进程和线程 任务Task:应用程序完成的 ...
- .net core 3.0 在过滤器读取request.body 里的请求,controller[FromBody]读取不到参数,解决办法
1,注入IHttpContextAccessor httpContex 2,var req = _httpContext.HttpContext.Request; // 这句很重要,开启读取 否者下 ...
- 划艇:dp/组合数/区间离散化
Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 N 个划艇学校,编号依次为 1 到 N.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划 ...
- CSPS模拟 59
经ooo提醒咕题解会掉rp 我反正也冒着改不完题的风险,就开始颓博了 话说好久没这么舒坦的垫过底了233 上来一看T1,立刻就转化题意为有奇偶性和距离限制的bfs 然后就没考虑子串不能越过母串边界的事 ...
- Asp.net Core 系列之--3.领域、仓储、服务简单实现
ChuanGoing 2019-11-11 距离上篇近两个月时间,一方面时因为其他事情耽搁,另一方面也是之前准备不足,关于领域驱动有几个地方没有想通透,也就没有继续码字.目前网络包括园子里大多领域驱 ...
- Python基础学习(一)之Python的概述与环境安装
Python介绍 Python语言介绍 Python是一门高级的.面向对象的.解释性.脚本语言. 高级语言:贴近开发者,对应底层语言,底层语言贴近机器:java.C#.php .ruby 面向对象对应 ...