有很多動態類型的面嚮對象語言,其中一個類本身就是一個對象。例如Smalltalk和Python。有沒有靜態類型的語言,其中一個類是一個對象?編輯:
術語「對象」,我的意思是第一類實體例如,Python中的類可以傳遞給其他方法,可以從方法等返回。有什麼靜態語言,其中一個類是一個對象?
回答
從奧列格Kiselyov和拉爾夫Lammel的"Haskell's overlooked object system"(重點煤礦),
不僅OOHaskell提供了傳統的面向對象的成語;我們還有 語言設計的幾種功能,它們在主流OO語言中都是先進的或無法實現的 :例如,一級班和班級關閉;靜態類型檢查的集合類,帶有隱式集合參數的有界多態性;多重繼承與用戶控制共享;安全協變 參數分類。
那麼,早期語言中的優點會減少。然而,類的Java反射對象基本上就是你所要求的。
爲什麼順便說一句,你想要嗎?它比閒置的好奇更重要嗎?
我不喜歡它。我只是好奇而已。 – missingfaktor
@missingfaktor:酷。 – Marcin
在很多靜態類型語言,像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 ;
}
請參閱我對@ RPM1884在該問題下的評論的回覆。 – missingfaktor
我編輯了我的答案。關於你的評論,String.class ***是**一個對象*,特別是它是一個Class類的實例。 – edutesoy
+1在靜態語言中,你可以用類做很多事情,但通常不會改變它們。雖然可以通過一些黑客來完成。我發現了一種在運行時更改Delphi類的祖先的方法。但的確,沒有方便的方法來這樣做。 – GolezTrol
看一看的homoiconicity這是指現存的一種語言可以參考它自己的結構概念。另請看看Eric Lippert發佈的this。
我不完全同意@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
- 1. Python:一個類中的靜態對象
- 2. 爲什麼其中一個模板靜態函數有效,另一個不是?
- 3. 另一個靜態對象
- 4. 爲什麼一個類允許自己擁有一個靜態成員,但不是一個非靜態成員?
- 5. 使用模塊,它是一個靜態鏈接的對象(Fortran語言)
- 6. 這個概念是否有一個術語,它是否存在於靜態類型語言中?
- 7. 靜態方法返回一個對象是一個包含類類型
- 8. 爲什麼Liftweb的`bootstrap.liftweb.Boot`是一個類,除了一個對象?
- 9. 在非靜態類中聲明一個靜態方法的意義是什麼?
- 10. 靜態函數有什麼區別,一個屬於靜態類,另一個不是?
- 11. 爲什麼公共靜態屬性返回一個對象?
- 12. 什麼時候父母有一個靜態類和一個孩子沒有?
- 13. 爲什麼.NET是一個框架和Java是一種語言
- 14. Python取消了一個對象,其中有一個類實例
- 15. pthread_cond_t是一個對象還是什麼?
- 16. 如何引用一個類的靜態私有對象?
- 17. JavaScript語法:什麼是({})它是一個函數還是對象?
- 18. 爲什麼一個類的靜態成員對於所有對象都是相同的?
- 19. 每個用戶是否有唯一的靜態對象?
- 20. 什麼類型給一個JSON對象
- 21. Hacklang是一種有狀態語言還是無狀態語言?
- 22. 什麼是一些最純粹的面向對象的語言?
- 23. 爲什麼靜態庫有一個init方法的類?
- 24. 有一個接口/類的公共靜態內部類的優點是什麼?
- 25. 有一個靜態指針到這個有什麼後果
- 26. 爲什麼ClassLoader是一個抽象類?
- 27. 一個類中的靜態預定義常量對象
- 28. 在類中定義一個const靜態對象變量
- 29. 通過一個對象循環不會給我其他語言
- 30. 什麼是在一個對象
要麼答案是'全部',要麼我真的不明白你的問題。有人說,一個對象是一個類的一個實例。其他人說,對象和類是同義詞,因此你創建一個對象/類*實例*來處理。你的定義是什麼? – GolezTrol
Objective-C是否計數? – BoltClock
除非我錯過了什麼..C#? Java的?名單繼續.. – RPM1984