鴨子類型
編輯計算機編程中的鴨子類型是鴨子測試的應用--如果它走路像鴨子,叫聲像鴨子,那么它一定是鴨子,以確定一個對象是否可以用于一個特定的目的。在名詞性類型中,如果一個對象被聲明為某一類型(或者通過對象繼承等機制推斷出類型與對象的關聯),那么該對象就屬于某一類型。在鴨子類型化中,如果一個對象具有該類型所要求的所有方法和屬性,那么它就屬于一個給定的類型。鴨子類型化可以被看作是給定對象和類型要求之間的基于使用的結構等價物。關于結構類型等價的進一步解釋,請參見結構類型化。
鴨子類型的例子
編輯這是Python3中的一個簡單例子,演示了任何對象如何在任何情況下被使用,直到它被用在它不支持的地方。
鴨子游泳
編輯鴨子飛翔鯨魚游泳AttributeError:'Whale'objecthasnoattribute'fly'(屬性錯誤)。所以,如果我們假設所有會游泳的東西都是鴨子,因為鴨子會游泳,我們會認為鯨魚是鴨子,但是,如果我們也假設它必須能夠飛行,鯨魚就不會被認為是鴨子。
在靜態類型語言中
編輯在一些靜態類型語言中,如Boo和D,類的類型檢查可以被指定為在運行時而不是編譯時發生。
與其他類型系統的比較
編輯結構類型系統鴨子類型類似于結構類型,但又不同于結構類型。結構化類型是一個靜態的類型系統,通過類型的結構來確定類型的兼容性和等價性,而鴨式類型是動態的,只通過類型結構中在運行時被訪問的部分來確定類型的兼容性。TypeScript、Elm和Python語言在不同程度上支持結構類型。
協議和接口
編輯協議和接口提供了一種方法,可以明確聲明一些方法、操作符或行為需要被定義(例如,必須有一個quack()方法)。如果一個第三方庫實現了一個不能修改的類,那么客戶就不能使用該庫未知接口的實例,即使該類事實上滿足接口要求。這個問題的一個常見解決方案是適配器模式。相比之下,在鴨子類型下,該對象將被直接接受,而不需要適配器。
模板或通用類型
編輯模板,或通用函數或方法在靜態類型化的背景下應用鴨子測試;這帶來了一般靜態與動態類型檢查的所有優點和缺點。鴨子類型也可以更靈活,因為只有在運行時實際調用的方法需要被實現,而模板需要實現所有在編譯時不能被證明為不可達的方法。在Java、Scala和Objective-C等語言中,反射可以用來檢查對象是否實現方法,甚至在運行時添加必要的方法。例如,Java的MethodHandleAPI就可以以這種方式使用。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/170710/