2011-03-04 82 views
4

在C#類中可以有可以有多個實現的接口。你怎麼做到這一點?是否有任何Smalltalk類接口的實現?

+0

[將動態接口添加到Smalltalk](http://www.jot.fm/issues/issue_2002_05/article1/index.html)[SmallInterfaces](http://map.squeak.org/package/b0e66fa3-5a41 -4720-886a-bc30aa8518a6) – igouy 2011-03-05 15:17:25

回答

12

首先你通常不需要接口,因爲如果一個對象實現了與另一個對象相同的消息,它可以替換它。在Java和C#中,除非它們處於相同的層次結構中,否則無法執行此操作,因此您需要接口。

  • 在(全部)Smalltalk中有一些協議(方法類別),用於將方法非正式地分組在一起。
  • Pharo Smalltalk有特質。起初他們看起來像接口,但他們也能夠提供一個實現。
+0

雖然接口在Smalltalk中並不是技術上必需的,但在編寫更大的軟件時它們會有很大的幫助,因爲它們定義了一個類保證遵守的正式合同。 AFAIK,並不是所有的Smalltalk方言都支持協議。我不認爲Visual Smalltalk可以。 – fzwo 2013-06-22 21:24:08

+0

'非正式'在這裏的意思是'在運行前沒有類型檢查' - 對嗎? – 2013-08-09 20:43:02

5

經過今天與我的一位同事的討論後,我覺得答案是任何類都可以被認爲是一個接口,因爲任何類都可以通過消息傳遞給任何其他類。

smalltalk中的任何數量的類都可以響應相同的消息,因此您不需要按照C#和java的接口。

5

正如盧卡斯所說,大多數時候,你不需要它們。主要是因爲要實現多態,唯一需要的是實現相同的消息。沒有必要爲它們定義一個通用類型。

另一方面,從我的角度來看,您確實需要接口。大多數情況下,當你有合同展示,或者有一種抽象超類時。這在開發框架時非常普遍。以記錄器或序列化器爲例。在這種情況下,您可能想要定義串行器應該實現的強制方法。然後,你可以創建一個抽象的超類,所有的方法來實現這種方式:

LoggerIterface >> log: anObject 
    self shouldBeImplemented 


LoggerIterface >> reset 
    self shouldBeImplemented 

等等......所以,檢查這個類,你現在哪些方法你必須實現以這個目的的作品的用戶好。 注意#shouldBeImplementedObject實現像這樣的東西(在菲羅Smalltalk中):

Object >> shouldBeImplemented 
    "Announce that this message should be implemented" 

    self error: 'This message should be implemented' 

但正如你所看到的,它只是一個慣例,它不是由語言本身罰款。

乾杯

馬里亞諾

+0

[SmallInterfaces](http://map.squeak.org/package/b0e66fa3-5a41-4720-886a-bc30aa8518a6) – igouy 2011-03-05 15:16:51

4

即使不叫「接口」,海豚的Smalltalk(http://www.object-arts.com/)提供了一個名爲「協議」,這是第一類對象的特徵。

每個協議定義了一組選擇器(方法名)的,並且可以測試一個類是否符合或不某個協議:

conformsToProtocol: protocol 
    "Answer whether the receiver conforms to the named <MethodProtocol>." 

你最終具有正式/定義的一組方法名的,並且您可以檢查某個對象是否可以在協議的上下文中使用。 此外,類瀏覽器將顯示所選類符合的協議列表。

有一個協議瀏覽器,所以你可以探索每個協議,並查看系統範圍內哪些類符合它們。

總結:接口在Smalltalk中不是必需的,至少不會實現多態。然而,某些Smalltalk方言爲協議提供了不同程度的支持,協議是接口的模擬,但是對於動態語言。

相關問題