2011-07-05 61 views
0

有很多動態類型的面嚮對象語言,其中一個類本身就是一個對象。例如Smalltalk和Python。有沒有靜態類型的語言,其中一個類是一個對象?編輯:
術語「對象」,我的意思是第一類實體例如,Python中的類可以傳遞給其他方法,可以從方法等返回。有什麼靜態語言,其中一個類是一個對象?

+2

要麼答案是'全部',要麼我真的不明白你的問題。有人說,一個對象是一個類的一個實例。其他人說,對象和類是同義詞,因此你創建一個對象/類*實例*來處理。你的定義是什麼? – GolezTrol

+1

Objective-C是否計數? – BoltClock

+0

除非我錯過了什麼..C#? Java的?名單繼續.. – RPM1984

回答

1

從奧列格Kiselyov和拉爾夫Lammel的"Haskell's overlooked object system"(重點煤礦),

不僅OOHaskell提供了傳統的面向對象的成語;我們還有 語言設計的幾種功能,它們在主流OO語言中都是先進的或無法實現的 :例如,一級班和班級關閉;靜態類型檢查的集合類,帶有隱式集合參數的有界多態性;多重繼承與用戶控制共享;安全協變 參數分類。

0

那麼,早期語言中的優點會減少。然而,類的Java反射對象基本上就是你所要求的。

爲什麼順便說一句,你想要嗎?它比閒置的好奇更重要嗎?

+0

我不喜歡它。我只是好奇而已。 – missingfaktor

+0

@missingfaktor:酷。 – Marcin

2

在很多靜態類型語言,像JAVA 一類是對象有自己的方法。 例如,在Java中,表示「String」類的對象可以作爲「String.class」訪問,然後您可以調用此類上的方法爲「String.class.getFields()」,「getMethods() 「,」getConstructor()「,」cast(obj)「等等。您可以在API documentation中看到」Class「類的所有方法。

不過,假設語言是靜態類型的,一類。

換句話說,你是不是找到一個名爲「類方法。 激活addField()「中的Class類,你可以做的更多的是‘擴展’通過繼承的類(如果不是最後)。

再換句話說,在一個‘類’對象只讀

通過術語「對象」,我的意思是第一類的實體。例如,在Python類可以被傳遞到其他的方法,可以從方法等

被返回

與任何其他對象一樣,您可以將它們傳遞給方法並從方法返回(它們只是常規對象,但只公開「read」方法)。示例(我省略了清晰的仿製藥):

public Class myMethod(Class someClassObject) { 
    System.out.println(someClassObject.getCanonicalName()); 
    Class anotherClass = String.class; 
    return anotherClass ; 
} 
+0

請參閱我對@ RPM1884在該問題下的評論的回覆。 – missingfaktor

+0

我編輯了我的答案。關於你的評論,String.class ***是**一個對象*,特別是它是一個Class類的實例。 – edutesoy

+0

+1在靜態語言中,你可以用類做很多事情,但通常不會改變它們。雖然可以通過一些黑客來完成。我發現了一種在運行時更改Delphi類的祖先的方法。但的確,沒有方便的方法來這樣做。 – GolezTrol

0

看一看的homoiconicity這是指現存的一種語言可以參考它自己的結構概念。另請看看Eric Lippert發佈​​的this

2

我不完全同意@edutesoy的答案。

First-class意味着一個隱式構造被指定爲一個可以像任何對象一樣傳遞的顯式構造。 Java中的類不是「一流的」,它們是可以檢查某些屬性但不是對象本身的鏡像。

你不能在運行時改變類的結構,添加字段,更改方法主體或簽名,並且在此視圖下,它的部分「只讀」是可以的。

但讓我們考慮靜態字段。我想大家都同意,除非final靜態字段是可變的,就像實例字段。在Smalltalk中,這些只是在類本身上定義的字段,而不是類中的實例。此外,在Smalltalk,類端方法是多態的,就像任何其他方法,並且:

aClass field: aValue. 

可能會解決不同,這取決於所傳遞的類。這在Java中是不可能的;必須通過其類型來引用靜態字段或方法。這也意味着它不是allow overriding static methods(閱讀鏈接瞭解更多詳情),如果他們真的是一流的話。

在Java中反射是可能的事實不會使類成爲「頭等」 - 您只能傳遞類的表示。回到原來的問題:我不知道任何靜態類型的語言與一流的類(但我的知識是有限的,也許存在)。

編輯

其實,現在我還記得它存在StrongTalk(http://www.strongtalk.org/),這是Smalltalk的靜態類型。打字問題進行了討論:Strongtalk: Typechecking Smalltalk in a Production Environment

+0

有趣的是,我不知道,但爲什麼Java類類實例不是一流的對象?我認爲它符合您的維基百科參考中聲明的5個要求。 – edutesoy

+1

@edutesoy什麼是一流的確實有點模糊的概念。但是1)'String'本身不是一個對象,只有'String.class'是2)靜態方法沒有綁定到一個類對象,因此不是多態3)類只能通過類加載器創建(定義的第4點)。 'String.class'是一個清晰的對象,但是將類作爲對象的反射處理並不像Smalltalk那樣是一流的。 – ewernli

相關問題