2010-12-10 49 views

回答

5

簡短的回答是「你的假設,類是系統級類的實例是錯誤的,每個類實際上是類特定類的實例」,也「它不會以任何其他方式工作」。

對答案稍作修改就是「名字真的很混亂,有時只是記住自己的角色,而不是過多地考慮他們的工作方式」。

短毛毛回答:

元類的實例,就像所有其他的普通的Smalltalk類,它需要它自己的專用類。常規Smalltalk對象的每個實例都有一個類,繼承類繼承。每個類本身都是類特定元類的一個實例,在元類層次結構之後有繼承。每個元類本身都是Metaclass類的一個實例,它由虛擬機在一個簡潔的小竅門中短路,因爲沒有人找到將Metaclass類作爲父類的用法,並且所有嘗試過的人都已經發現他們的理智在這個過程中開始削弱。

更長,還是毛毛回答:

Smalltalk中允許爲每個類包含類的特定消息。這些大致等同於Java中的靜態方法 - 但有一些重大差異。這些差異之一就是Smalltalk類實際上是實例化的對象 - 它們是系統中的活動對象,具有從其他對象繼承的能力,並且包含實例變量。

該屬性會導致系統中潛在的衆多繼承層次結構。常規對象每個都只有一個Class的實例,並將消息發送給搜索對象類的對象,然後跟蹤Class層次結構的繼承鏈。發送到常規對象的消息將在類層次結構中解析。

此外,類對象是一個類特定的Metaclass的每個實例。發送到類對象的消息通過查找類特定元類,然後向上在元類層次結構上解析。

向上一層,元類對象每個都是系統寬度獨特的Metaclass類的實例。發送到元類對象的消息在系統範圍內唯一的Metaclass中查找,它不允許從任何人繼承,並且在虛擬機中被硬連線爲短路。

從技術上講,系統有兩個繼承層次結構,第三個是僞造的短路。沒有理論上的理由要停下來,雖然有很多實際的。這允許每個對象擁有它自己的對象唯一的消息,每個類都擁有自己的類別唯一的消息,並強制所有元類僅回答Metaclass中定義的一組消息。

整潔,是吧?

+1

當然,如果你使用類做掉乾脆,ALA http://selflanguage.org/,你永遠不用擔心這樣的事情。 – blueberryfields 2010-12-10 22:53:57

+0

是的,但爲什麼Metaclass的Metaclass實例不是類? – 2010-12-10 23:03:12

+0

哎呀,我的手指沾滿了...這是一個命名約定。同樣的方法點是Point的實例。 – blueberryfields 2010-12-10 23:10:56

3

您顯然需要兩個ClassDescriptions類:一個用於實例方法,另一個用於類方法。

現在,您仍然可以嘗試爲兩個對象使用Class。我認爲擁有Metaclass的一個原因是你需要區分這兩者。如果你看theMetaClasstheNonMetaClass的方法,你會發現它們是相互鏡像的:你通過這個類成員從元類到類,從類到元類通過常規類指針(任何對象擁有)。如果他們都是實例類,他們不知道他們實現了哪一方 - 除非有一個標誌位,這比創建子類更糟糕。

1

這是那些我完全理解...直到我解釋了吧;-)多蒸餾後的事情之一......

考慮:

  • 對象的行爲是通過指定同級車
  • 類對象,也
  • 定期對象/類具有行爲纔有意義,定期對象/類

因此,類和實例應該有不同的行爲描述符(即類)。

看着另一種方式,我們稱之爲「實例方」代表的實例方。我們稱之爲「類方」代表元類的實例方。

例如,Class定義了#addClassVarNamed:和#addInstVarNamed :,因爲這些對實例端都有意義,因爲Metaclass只定義了#addInstVarNamed :,因爲沒有類方面的類變量。

要深入挖掘細節,請參見「菲羅通過示例」或「Smalltalk的編程技術基礎」

相關問題