簡體   English   中英

Smalltalk超類vs元類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM