java实现鸭子类型,Golang的interface及duck typing鸭子类型
Golang的interface及duck typing鴨子類型
“當看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。” 意思就是: 一個東西究竟是不是鴨子,取決于它能不能滿足鴨子的工作。
duck typing 多見于動態(tài)語言,例如PHP,Python等.
在靜態(tài)語言中比較罕見,但是在go中duck typing處處都是duck typing.go的interface{}和duck typing密不可分.
原理說明
duck typing描述事物的外部行為而非內(nèi)部結(jié)構(gòu)
在面向?qū)ο蟮木幊陶Z言中,當某個地方(比如某個函數(shù)的參數(shù))需要符合某個條件的變量(比如要求這個變量實現(xiàn)了某種方法)時,什么是判斷這個變量是否“符合條件”的標準?
如果某種語言在這種情況下的標準是: 這個變量的類型是否實現(xiàn)了這個要求的方法(并不要求顯式地聲明),那么這種語言的類型系統(tǒng)就可以稱為 duck typing
鴨子類型(英語:duck typing):
是動態(tài)類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由"當前方法和屬性的集合"決定。
個人理解,誰調(diào)用誰實現(xiàn),比如你要調(diào)用一個A函數(shù),而A函數(shù)中接收參數(shù)的同時調(diào)用了參數(shù)中的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("這是唐老鴨")
# 被調(diào)用的函數(shù)
def duckSay(func):
return func.gaga()
# 限制調(diào)用方式
if __name__ != '__main__':
print("must __main__")
# 實例化對象
duck = PsyDuck()
person = DoningdDuck()
# 調(diào)用函數(shù)
duckSay(duck)
duckSay(person)
GoLang案例
package main
import "fmt"
//定義一個鴨子接口
//Go 接口是一組方法的集合,可以理解為抽象的類型。它提供了一種非侵入式的接口。任何類型,只要實現(xiàn)了該接口中方法集,那么就屬于這個類型。
type Duck interface {
Gaga()
}
//假設現(xiàn)在有一個可達鴨類型
type PsyDuck struct{}
//可達鴨聲明方法-滿足鴨子會嘎嘎叫的特性
func (pd PsyDuck) Gaga() {
fmt.Println("this is PsyDuck")
}
//假設現(xiàn)在有一個唐老鴨類型
type DoningdDuck struct{}
//唐老鴨聲明方法-滿足鴨子會嘎嘎叫的特性
func (dd DoningdDuck) Gaga() {
fmt.Println("this is DoningdDuck")
}
//要調(diào)用的函數(shù) - 負責執(zhí)行鴨子能做的事情,注意這里的參數(shù),有類型限制為Duck接口
func DuckSay(d Duck) {
d.Gaga()
}
func main() {
//提示開始打印
fmt.Println("duck typing")
//實例化對象
var pd PsyDuck//可達鴨類型
var dd DoningdDuck//唐老鴨類型
//調(diào)用方法
pd.Gaga()//因為可達鴨實現(xiàn)了所有鴨子的函數(shù),所以可以這么用
dd.Gaga()因為唐老鴨實現(xiàn)了所有鴨子的函數(shù),所以可以這么用
}
總結(jié)
以上是生活随笔為你收集整理的java实现鸭子类型,Golang的interface及duck typing鸭子类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 程序运行在阿里云主机_阿里
- 下一篇: IOS中的事件响应链,事件冒泡机制基本了