java实现鸭子类型,Golang的interface及duck typing鸭子类型

Golang的interface及duck typing鸭子类型

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 意思就是: 一个东西究竟是不是鸭子,取决于它能不能满足鸭子的工作。

duck typing 多见于动态语言,例如PHP,Python等.

在静态语言中比较罕见,但是在go中duck typing处处都是duck typing.go的interface{}和duck typing密不可分.

原理说明

duck typing描述事物的外部行为而非内部结构

在面向对象的编程语言中,当某个地方(比如某个函数的参数)需要符合某个条件的变量(比如要求这个变量实现了某种方法)时,什么是判断这个变量是否“符合条件”的标准?

如果某种语言在这种情况下的标准是: 这个变量的类型是否实现了这个要求的方法(并不要求显式地声明),那么这种语言的类型系统就可以称为 duck typing

鸭子类型(英语:duck typing):

是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。

个人理解,谁调用谁实现,比如你要调用一个A函数,而A函数中接收参数的同时调用了参数中的B方法.这时候你就要传进去一个具有B方法名的一个对象.

代码案例

对比Python3的duck typing案例

#!/usr/local/bin/python3

# coding=utf8

# 使用的对象和方法

class PsyDuck(object):

def gaga(self):

print("这是可达鸭")

# 使用的对象和方法

class DoningdDuck(object):

def gaga(self):

print("这是唐老鸭")

# 被调用的函数

def duckSay(func):

return func.gaga()

# 限制调用方式

if __name__ != '__main__':

print("must __main__")

# 实例化对象

duck = PsyDuck()

person = DoningdDuck()

# 调用函数

duckSay(duck)

duckSay(person)

GoLang案例

package main

import "fmt"

//定义一个鸭子接口

//Go 接口是一组方法的集合,可以理解为抽象的类型。它提供了一种非侵入式的接口。任何类型,只要实现了该接口中方法集,那么就属于这个类型。

type Duck interface {

Gaga()

}

//假设现在有一个可达鸭类型

type PsyDuck struct{}

//可达鸭声明方法-满足鸭子会嘎嘎叫的特性

func (pd PsyDuck) Gaga() {

fmt.Println("this is PsyDuck")

}

//假设现在有一个唐老鸭类型

type DoningdDuck struct{}

//唐老鸭声明方法-满足鸭子会嘎嘎叫的特性

func (dd DoningdDuck) Gaga() {

fmt.Println("this is DoningdDuck")

}

//要调用的函数 - 负责执行鸭子能做的事情,注意这里的参数,有类型限制为Duck接口

func DuckSay(d Duck) {

d.Gaga()

}

func main() {

//提示开始打印

fmt.Println("duck typing")

//实例化对象

var pd PsyDuck//可达鸭类型

var dd DoningdDuck//唐老鸭类型

//调用方法

pd.Gaga()//因为可达鸭实现了所有鸭子的函数,所以可以这么用

dd.Gaga()因为唐老鸭实现了所有鸭子的函数,所以可以这么用

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小猴吃桃matlab,看图写话:小猴吃桃精彩选篇

看图写话:小猴吃桃精彩选篇两只聪明的小猴子一天上午,风和日丽。佳佳和皮皮到小溪边玩耍,忽然皮皮开心的大叫:“快看那边有好多又大又红的桃子!”这时佳佳也高兴的欢呼着,馋的它们开水直流。皮皮和佳佳都在…

php mysql 分行执行,php执行mysql存储及执行脚本

php执行mysql存储及执行脚本php页面执行mysql存储过程:# vi cunchu.php$db new mysqli("localhost","root","123456","team1");$result$db->query("CALL challenge_crontab()");?>:wq注释:执行team1数据…

oracle 换字段顺序,修改ORACLE的字段顺序

首先你要有一个pl/sql,其实没有也行,但是这数据库还是有一个可视化界面为好啊。1.首先,以sys用户的身份登录PL/SQL2.查询出你要更改的表的ID,以我本地的数据为例,我要改‘FINACE‘用户下‘INCOME‘这张表。注&#xff…

oracle单行子查询返回多个行 order by,单行子查询返回多个行 Issue分析求助

with order_base as --获取订单基础情况(select ou.order_key order_key, ou.order_quantity_i, ood.dispatch_time_t, ou.part_number_s, I032ZZ01 pline_name_sfrom order_uv ou left join at_as_om_orderdispatchstatus ood on ou.order_key ood.order_54union allselect m…

php按照名称搜索,PHP从类型和名称搜索

很抱歉,标题不好,但我不知道有更好的选择.目前,我正在创建一个搜索引擎以获取产品详细信息.我有2种搜索类型,第一种是使用产品类型进行搜索,另一种是使用产品名称进行搜索.这是搜索代码:$search_exploded explode (" ", $search);$x "";$cons…

srvctl 在oracle下运行,在RAC 中解决 vipca 和 srvctl 无法执行的错误

问题一: vip创建问题/home/oracle/crs/oracle/product/10/crs/jdk/jre//bin/java: error while loading shared libraries: libpthread.so.0: cannot open shared object file解决方法:这个错误一般是在 5上装 时会碰到的,当界面提示你用root脚本执行相应…

简述oracle数据库特殊状态,【OracleDB】 01 概述和基本操作

实例概念:Oracle有一个特殊的概念Oracle数据库 数据库 Oracle文件系统 Oracle实例实例处理Oracle的请求,调用文件系统然后返回结果响应给客户端单实例和多实例一个数据库可以对应多个实例操作数据库服务这是Oracle数据库的服务,一定要安装…

oracle会闪,oracle闪来

当前位置:我的异常网 数据库 oracle闪来oracle闪来www.myexceptions.net 网友分享于:2013-09-10 浏览:1次oracle闪回闲来无事,把以前的笔记整理一下放到这里。默认情况下,oracle10g可以直接闪回表,闪回表数据&#…

oracle导出有分区表的用户,分区表导出导入

--创建分区表create table t2(id int,name varchar2(10))partition by range(id)(partition p1 values less than(10),partition p2 values less than(20),partition p3 values less than(30),partition p4 values less than(40),partition p5 values less than(50))--插入数据…

php分流短信服务商,使用第三方短信服务商云片发送短信(php样例)

//智能匹配模版接口发送样例$apikey "---------------------------"; //请用自己的apikey代替$mobile "--------------"; //请用自己的手机号代替$text"【云片网】亲爱的doubiyuzai,您的验证码是------。有效期为100000000小时&#xff…

oracle中affirm,2.Oracle Data Guard 参数介绍

Oracle Data Guard 参数介绍Data Guard作为Oracle提供的一个高可用及灾备解决方案,理解并可以实施它对于DBA来说是非常重要套的技能上节介绍了有关Data Guard的概念,这节将介绍相关的一些参数有的参数是做为备库角色时才生效的,会单独说出来1. DB_NAME该…

linux lib目录找不到,linux中jpeglib库文件我安装了,但是我运行自己写的代码总是找不到这个库...

首先,找到你的VC6.0的安装路径(就是你安装到哪里了,不是你安装包setup.exe的路径),假设按照默认路径安装的话,头文件和库文件的路径应该是这样子的:include files:C:\Program Files\Microsoft Visual Studio\VC98\INCL…

连接linux桌面命令,连接Linux远程桌面的四个方法

有下面四种方法:一、通过xshell直接调用程序窗口。二、通过xbrower连接Linux完整的桌面。三、通过Linux连接Linux的远程桌面,可完整桌面,也可打开程序窗口。四、通过VNC连接桌面。一、安装xmanager,用xshell连接到Linux服务器&…

linux基础磁盘管理,Linux基础入门-文件系统操作与磁盘管理

chrome 更新flash插件下载下面的插件并安装 https://fpdownload.macromedia.com/pub/labs/flashruntimes/flashplayer/install_flash_player ...sort DEMO测试用文件: [weblogicetp-mall-dev7][/tmp]$ cat msn.txt aaa, fff, bbb, cc, ee, gg, hh, zz, mmm, DEMO1:按第一 ...Qt…

linux mysql 性能提高,高手心得:提高MySQL性能的方法

lgms2008 于 2006-09-20 00:18:05发表:5. NOT我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:... whe…

Linux单独编译设备树,迅为IMX6Q开发板-非设备树内核-单独编译内核驱动

内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以模块的方式编译内核驱动。要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章。9.5.2.1 内核和编译器路径本节介绍内核路径、编译…

linux+top+常用参数,linux的top命令参数详细说明

Linux中的top命令是个常用的命令之一,下面由学习啦小编为大家整理了Linux的top命令参数详细说明,希望对大家有帮助!linux的top命令简介top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windo…

linux中常用名词解释,科学网—linux中常见名词解释 - 武海丹的博文

Shell:是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。(当用户发出指令,其实先将这些指令发送给…

linux学习手册,Linux命令学习手册-ps

ps [选项]功能察看运行进程。举例显示所有进程$ps aux输入之后&#xff0c;输出如下&#xff1a;USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 3056 876 ? Ss 09:16 0:01 /sbin/initroot 2 0.0 0.0 0 0 ? S< 09:16 0:00 [kthreadd]root 2289 0.…

linux c 封装redis,封装hiredis——C++与redis对接(一)(string的SET与GET操作)

redis&#xff0c;总想着像Mysql一样&#xff0c;在C/C中进行对接。于是查询了一些资料&#xff0c;最后找到了hiredis。然而直接用它的话&#xff0c;难免有点不方便。于是&#xff0c;对其进行封装。hiredis直接去git上克隆&#xff0c;地址&#xff1a;https://github.com/r…