[英]Smalltalk superclass vs metaclass?
我是OOP的新手,但具有“程序”背景。
我目前正試圖通過GNU Smalltalk和Lovejoy的“Smalltalk:獲取消息”來了解OOP。
我對metaclass和Metaclass類與超類相比很困惑。 我可以看到超類的繼承流 - > class - > subclass; 但是我不知道元類是如何適應的.TIA ......
在免費的在線書籍Pharo by Example ,Chapter 13(Classes and metaclasses)中有一個很好的描述。 本章中解釋的內容對於所有Smalltalk實現都是通用的。
實際上有兩個級別的繼承:實例繼承和類繼承。
Smalltalk有一個特殊的方案,可以將類作為對象傳遞。 這意味着類也是自己權利的對象 。 元類是“簡單地”類對象的類。
它不會干擾正常的實例繼承,因此它不適合您使用的superclass -> class -> subclass
圖中的任何位置。
基於類的OO有兩種不同的關系: 實例化和繼承 。
實例化是對象與其類 , new
關鍵字等之間的關系。通常它是由任何對象的低級表示中的指針實現的。 在Smalltalk中, anObject class
遍歷此指針; 同樣,類也是對象,類的類稱為元類,但這與實例的關系相同。
繼承是類之間的關系。 您可以通過執行aClass superclass
從一個類轉到它的超aClass superclass
,並繼續這樣做,直到你到達Object
類。 在Smalltalk中,超類指針只是在所有類上定義的實例變量,而superclass
消息是普通訪問器。
作為一個概念, superclass
是對象superclass
的父類。 即Class層次結構中的Class級別高於當前對象的Class級別。
作為命名方法,它返回接收者的直接超類的名稱。 例如,它在Squeak Smalltalk(以及它的衍生物,Pharo和Cuis)中被定義為superclass "Answer the receiver's superclass, a Class." ^superclass
superclass "Answer the receiver's superclass, a Class." ^superclass
在Dolphin Smalltalk中,它被定義為“超類”答案是接收者的直接超類(或者如果沒有)。“
^superclass'
但是 - 類層次結構中的每個類實際上都是其父類的實例。 因此,給定類是其實例的類是Class的MetaClass。
因此,例如aSortedCollection是一個對象 - Class SortedCollection的一個實例。
SortedCollection是可瀏覽的類層次結構中的類命名類“SortedCollection”。 同時,它也是 Metaclass的一個實例 - 一個匿名類,它有一個單例對象實例,它是一個命名類。 命名類在類層次結構中可見,但Metaclass(匿名)更不可見。 它就是Smalltalk
Smalltalk維護一個Metaclass層次結構,即類的類的層次結構。 它不太可見,因為它作為匿名系統對象保存,但您可以在類瀏覽器中找到Metaclass層次結構的頂級。 Class Class
和Class Metaclass
都被認為是Class Behaviour
的子類,它本身就是Class Object
的子類。
人們說“在Smalltalk中,一切都是對象”的一個原因是因為類Object
是所有其他類和對象的根 - 它位於對象層次結構的最頂層,它包含類層次結構和元類層次結構。
(通常在這個階段,我的大腦開始從我的耳朵流血,但是以下3點幫助將它全部推回到我的頭骨中)
如果你發送消息anInstanceOfAClass class
- 你會得到
返回的對象anInstanceOfAClass的類。
如果你發送消息anInstanceOfAClass class superclass
- 你會得到
返回的對象anInstanceOfAClass的類的父類。
如果發送消息anInstanceOfAClass class class
- 您將獲得對象anInstanceOfAClass返回的類的匿名單例Metaclass。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.