我想知道爲什麼有兩個不同的類使用的原因,而不是僅僅使用Class。爲什麼Metaclass的Metaclass實例不是Class?
回答
簡短的回答是「你的假設,類是系統級類的實例是錯誤的,每個類實際上是類特定類的實例」,也「它不會以任何其他方式工作」。
對答案稍作修改就是「名字真的很混亂,有時只是記住自己的角色,而不是過多地考慮他們的工作方式」。
短毛毛回答:
元類的實例,就像所有其他的普通的Smalltalk類,它需要它自己的專用類。常規Smalltalk對象的每個實例都有一個類,繼承類繼承。每個類本身都是類特定元類的一個實例,在元類層次結構之後有繼承。每個元類本身都是Metaclass類的一個實例,它由虛擬機在一個簡潔的小竅門中短路,因爲沒有人找到將Metaclass類作爲父類的用法,並且所有嘗試過的人都已經發現他們的理智在這個過程中開始削弱。
更長,還是毛毛回答:
Smalltalk中允許爲每個類包含類的特定消息。這些大致等同於Java中的靜態方法 - 但有一些重大差異。這些差異之一就是Smalltalk類實際上是實例化的對象 - 它們是系統中的活動對象,具有從其他對象繼承的能力,並且包含實例變量。
該屬性會導致系統中潛在的衆多繼承層次結構。常規對象每個都只有一個Class的實例,並將消息發送給搜索對象類的對象,然後跟蹤Class層次結構的繼承鏈。發送到常規對象的消息將在類層次結構中解析。
此外,類對象是一個類特定的Metaclass的每個實例。發送到類對象的消息通過查找類特定元類,然後向上在元類層次結構上解析。
向上一層,元類對象每個都是系統寬度獨特的Metaclass類的實例。發送到元類對象的消息在系統範圍內唯一的Metaclass中查找,它不允許從任何人繼承,並且在虛擬機中被硬連線爲短路。
從技術上講,系統有兩個繼承層次結構,第三個是僞造的短路。沒有理論上的理由要停下來,雖然有很多實際的。這允許每個對象擁有它自己的對象唯一的消息,每個類都擁有自己的類別唯一的消息,並強制所有元類僅回答Metaclass中定義的一組消息。
整潔,是吧?
您顯然需要兩個ClassDescriptions類:一個用於實例方法,另一個用於類方法。
現在,您仍然可以嘗試爲兩個對象使用Class。我認爲擁有Metaclass的一個原因是你需要區分這兩者。如果你看theMetaClass
和theNonMetaClass
的方法,你會發現它們是相互鏡像的:你通過這個類成員從元類到類,從類到元類通過常規類指針(任何對象擁有)。如果他們都是實例類,他們不知道他們實現了哪一方 - 除非有一個標誌位,這比創建子類更糟糕。
這是那些我完全理解...直到我解釋了吧;-)多蒸餾後的事情之一......
考慮:
- 對象的行爲是通過指定同級車
- 類對象,也
- 定期對象/類具有行爲纔有意義,定期對象/類
因此,類和實例應該有不同的行爲描述符(即類)。
看着另一種方式,我們稱之爲「實例方」代表類的實例方。我們稱之爲「類方」代表元類的實例方。
例如,Class定義了#addClassVarNamed:和#addInstVarNamed :,因爲這些對實例端都有意義,因爲Metaclass只定義了#addInstVarNamed :,因爲沒有類方面的類變量。
要深入挖掘細節,請參見「菲羅通過示例」或「Smalltalk的編程技術基礎」
- 1. Metaclass deligate不是實例
- 2. 在Groovy什麼實例的metaClass上和同級別的的metaClass
- 3. 爲什麼「class」,「metaClass」和「declaringClass」不能用作JSON-lib中的鍵?
- 4. 爲什麼Groovy的地圖沒有metaClass?
- 5. 爲什麼在這裏調用metaclass __getattribute__?
- 6. Python metaclass和ModGrammar
- 7. Metaclass Mixin或Chaining?
- 8. Metaclass衝突,多繼承和實例作爲父
- 9. 爲什麼Class是Class的一個實例,而不是Object的實例?
- 10. Groovy Spread Operator with metaClass
- 11. Groovy的 - 使用的metaClass
- 12. Groovy的metaClass的範圍?
- 13. 使用Groovy metaClass實現特殊方法
- 14. 如何從Groovy中的MetaClass方法引用GroovyObject實例?
- 15. 模擬Gradle project.exec {...}使用metaClass
- 16. 向metaclass添加方法
- 17. Metaclass不在子類中調用
- 18. SQLAlchemy的 - 密新VS MetaClass的修飾
- 19. groovy中的java類的metaClass屬性
- 20. 瞭解Grails測試中的metaClass
- 21. 來自Flask-MongoKit的Metaclass錯誤
- 22. Metaclass配置。 Python版本衝突
- 23. groovy metaclass替換超類方法
- 24. 基於表庫動態創建sqlAlchemy Metaclass
- 25. Groovy Expando Metaclass安裝人員訪問
- 26. 在域對象上設置metaClass屬性
- 27. 爲什麼Class實例會覆蓋另一個實例
- 28. 如何使用metaClass和invokeMethod實現委派?
- 29. 爲什麼`Class`和`Class <?>`的實例有不同的行爲,應該不是這樣?
- 30. Nashorn是否具有類似於Groovy metaClass的元編程?
當然,如果你使用類做掉乾脆,ALA http://selflanguage.org/,你永遠不用擔心這樣的事情。 – blueberryfields 2010-12-10 22:53:57
是的,但爲什麼Metaclass的Metaclass實例不是類? – 2010-12-10 23:03:12
哎呀,我的手指沾滿了...這是一個命名約定。同樣的方法點是Point的實例。 – blueberryfields 2010-12-10 23:10:56