在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
duck typing概念要理解duck typing的概念,先问一个问题.上图是不是一个鸭子?
看到这个问题,肯定很多人都已经晕了,这是什么问题?第一反应有人会觉得这是个鸭子,而有人觉得它不是.类似这样的问题,就是duck typing的概念的起因.像不像是由观察者决定. Python与C++中duck typing在Python,C++中,支持duck typing,也就是方法中泛型变量调用的方法是否存在,只有在编译(C++)或者运行时(Python)才知道.这种灵活性带来了很大的便利,但是有一个致命的问题,编写代码时,没有提示.只能通过注释的手段提醒实现者,必须实现那些方法 Java没有duck typing因为之前是主用Java,所以对于duck typing,没有概念,这里也搞了很久,只能说大致明白.在Java中不可能存在一个泛型调用其泛型内,没有定义的方法.如果需要调用方法必须使用继承泛型形式, 所以Java通过强限制的方法,使得在编写代码时就提醒实现接口者,必须实现那些接口中方法.所以做到编辑器提醒,但是却又不够灵活. 不够灵活的原因,实现者强关联接口,接口有一点小的变动,所有的实现者都需要更改,非常麻烦.所以我们可以发现,Java中List接口为什么到了Jav8才敢动,因为使用List排序是一个很常见的需求,一直没有动的原因,就是只要一动就会牵扯到非常多的系统. Java8中解决方案是,增加关键字 GO语言中没有duck typing?严格来说GO语言中是没有duck typing的,因为GO是基于结构化接口,当然这个结构化接口我还不是很懂. 但是从另一方面,以上两个接口的痛点出发,我们看一下GO语言是如何解决这两个问题的. 总结Python与C++,Java 中duck typing的缺点:
GO语言解决方法: 使用者定义接口,接口的实现是隐式的,只需要实现接口里的方法即可.也就是说只要一个结构体内有与另一个接口一样的方法(参数与返回值类型相同)就认为其实现该接口,在代码上没有交集. 作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star???? |
请发表评论