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()因為唐老鴨實現了所有鴨子的函數,所以可以這么用
}
總結
以上是生活随笔為你收集整理的java实现鸭子类型,Golang的interface及duck typing鸭子类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 程序运行在阿里云主机_阿里
- 下一篇: IOS中的事件响应链,事件冒泡机制基本了