2010-01-08 40 views
4

通過擴展我的視野與我的蟒蛇的經驗,我把一些想法。類型與界面:爲什麼打字呢?

如果實體對外部客戶端的願景是通過其接口實現的,那麼類型的目的是什麼?

在靜態類型語言中,類型具有非常強烈的核心重要性。類型和接口是嚴格關聯的。例如,在java中,當聲明一個接口FooIface和一個對象實現該接口時,即使在方法,簽名和例外方面兩者完全相同,也不能在需要BarIface的上下文中使用它。

在Python中並非如此。即使兩個對象具有完全不同且不相關的類型,只要它們的界面相同,它們就完全可以透明地互換。如果它像鴨子一樣嘎嘎嘎嘎地行走,那就是一隻鴨子。我可以通過在運行時完全改變它的接口來完全改變對象的性質,但它會保留原始類型。

這個觀點在javascript中被放到了極致,任何原型鏈中的每個對象都只是一個對象。你問在JavaScript中的每個對象的類型,它會告訴你,這是一個對象。

在我看來,這些語言的類型的概念是徒勞的限制。那麼真正重要的是什麼?類型在動態類型語言中有真正意義嗎?

回答

1

我沒有看到無用功。考慮:

1)。當你構造一個物體時

var myThing = new Thing(...); 

物的類型有意義。 2)。事的方法,可以根據其類型

3)的知識使用

this.aProperty 

。您可以使用instanceof來確定類型

+0

這些都是有趣的一點。讓我考慮一下,最終我會回來。 +1 btw。 – 2010-01-08 07:53:47

1

我傾向於將「type」一詞理解爲等效於Python中的「class」一詞。這只是99%正確,但足夠接近。

>>> type(object) 
<type 'type'> 
>>> class X(object): 
... pass 
... 
>>> type(X) 
<type 'type'> 
>>> type(_) 
<type 'type'> 
>>> type(X()) 
<class '__main__.X'> 
>>> type(X) is type(type) 
True 

但是,我通常在這種情況下避免使用「type」這個詞。總的來說,我看到它的方式是這樣的:「類型」這個詞意味着所討論的事物不是一流的對象。

+0

是的,當然我的意思是一個實例的類型。 – 2010-01-08 07:55:30

+0

這就是我的意思。兩個極端:在Python中,實例的「類型」本身就是一個實例。在C++中,一個實例的「類型」是一些更高層次的存儲,它不能通過編程訪問[我知道存在方法;這更多來自哲學的立場]。 – balpha 2010-01-08 08:05:07

1

如果語言只考慮類的實現方法來推斷它符合哪個接口,則可以意外實現一個接口。可以用Java語言表示你有接口IAIB它們都定義了方法longgetRemainingTime。在這種情況下,這些接口的合約將指定它們將返回什麼樣的格式(可以以秒爲單位返回時間,而另一個以毫秒爲單位返回時間)。此外,使用這些接口的上下文可能會非常不同。可以說他們不叫IAIBIProgressIStopWatch。在這種情況下,返回的時間將具有非常不同的含義。如果你能夠按照你的喜好交換這兩個接口,你可能會得到非常意想不到的結果。

一般來說,這種類型可以被看作是進行基本的靜態代碼分析的輔助工具。如果你實現了一個特定的接口,那麼編譯器可以直接告訴你,如果你試圖將一個實現的實例傳遞給一個期望類似實現但類型不同的方法,那麼你可能犯了一個錯誤。

相關問題