id:m-hiyama:20080109:1199863428 ã‚’ Squeak Smalltalk ã§
ãªã«ã‹ã„ã‚ã„ã‚ã¨å¤§äº‹ãªãƒã‚¤ãƒ³ãƒˆã‚’ãƒã‚ºã—ã¦ã—ã¾ã£ã¦ã„るよã†ãªæ°—ã‚‚ã™ã‚‹ã®ã§ã™ãŒã€ã²ã‚‹ã¾ãšã«ã€‚
図ã¯ã€èµ¤çŸ¢å°ãŒç¶™æ‰¿é–¢ä¿‚ã€é»’矢å°ãŒã‚¯ãƒ©ã‚¹-インスタンス関係ã§ã™ã€‚
Object subclass: #Person instanceVariableNames: 'name' Person class >> named: nameString ^self new name: nameString; yourself Person >> name: nameString name := nameString
| s1 s2 p | s1 := 'Hello'. s2 := 'Bye-bye'. p := Person named: 'tonkichi'. " 1 " self assert: [ByteString allSuperclasses includes: Object]. self assert: [(ByteString class) allSuperclasses includes: Object class]. " 2 " self assert: [Person superclass == Object]. self assert: [(Person class) superclass == Object class]. " 3 " self assert: [Metaclass allSuperclasses includes: Object]. self assert: [(Metaclass class) allSuperclasses includes: Object class]. self assert: [(Object class) allSuperclasses includes: Object]. " 4 " self assert: [s1 class == ByteString]. " 5 " self assert: [s2 class == ByteString]. " 6 " self assert: [p class == Person]. " 7 " self assert: [(ByteString) class == ByteString class]. self assert: [(ByteString class) class == Metaclass]. " 8 " self assert: [(Person) class == Person class]. self assert: [(Person class) class == Metaclass]. " 9 " self assert: [(Object) class == Object class]. self assert: [(Object class) class == Metaclass]. " 10 " self assert: [(Metaclass) class == Metaclass class]. self assert: [(Metaclass class) class == Metaclass]. ^'OK'
檜山ã•ã‚“ã® Java を模ã—ãŸä¾‹ã‹ã‚‰ã™ã‚‹ã¨ã¡ã‚‡ã£ã¨ã‚„ã‚„ã“ã—ã„ã®ã§ã™ãŒã€Smalltalk ã§ã€ã‚るオブジェクトãŒå±žã™ã‚‹ã‚¯ãƒ©ã‚¹ã®ã‚¯ãƒ©ã‚¹ã‚ªãƒ–ジェクトを得るã®ã«ã¯ #getClass() ã§ã¯ãªãã€#class ã¨ã„ã†ãƒ¡ã‚½ãƒƒãƒ‰ã‚’コールã—ã¾ã™ã€‚ã¾ãŸã€ã™ã§ã«ã‚¯ãƒ©ã‚¹ã¯ã™ã¹ã¦ä¸€éšŽã«è½ã¨ã—è¾¼ã¿æ¸ˆã¿ãªã®ã§ã€ã‚¯ãƒ©ã‚¹åã¯ãã®ã¾ã¾ã‚¯ãƒ©ã‚¹ã‚ªãƒ–ジェクトã¨ã—ã¦å‚ç…§å¯èƒ½ã§ã™ï¼ˆã—ãŸãŒã£ã¦ .class ã®æœ‰ç„¡ã«ã‚ˆã‚‹ä¸¡è€…ã®åŒºåˆ¥ã¯ç„¡ç”¨ï¼‰ã€‚スーパークラスã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ #superclass を用ã„ã¾ã™ã€‚
Smalltalk 㯠今ã¯ä¸‰éšŽ 四階 建ã¦ã§ã™ã€‚ã¤ã¾ã‚Šã€æªœå±±ã•ã‚“ã®ä¾‹ã®ã‚ˆã†ã« CLASS(ã‚ã‚‹ã„ã¯ãれを下階ã¸è½ã¨ã—込んã Class )ã²ã¨ã¤ã§ã¯ãªãã€ãã‚Œãžã‚Œã®ã‚¯ãƒ©ã‚¹ã²ã¨ã¤ã«ã²ã¨ã¤ã¥ã¤ã«ãã‚ŒãŒå±žã™ã‚‹ã‚¯ãƒ©ã‚¹ãŒã‚ã‚Šã€ãれをメタクラスã¨å‘¼ã³ã¾ã™ã€‚メタクラスã¯åŽŸå‰‡ã¨ã—ã¦ç„¡åã§ã™ãŒã€ä¾¿å®œçš„ã«ã€Œã‚¯ãƒ©ã‚¹å classã€ã¨å‘¼ç§°ã—ã¾ã™ã€‚ãŸã ã“ã‚Œã¯ã€ãƒ¡ã‚¿ã‚¯ãƒ©ã‚¹ã‚ªãƒ–ジェクトを得るå¼ã§ã‚‚ã‚ã‚‹ã®ã§ã€ä¸Šã®ã‚¹ã‚¯ãƒªãƒ—トã§ã¯ç´›ã‚‰ã‚ã—ã•ã‚’軽減ã™ã‚‹ãŸã‚ã«å¼ã®ã»ã†ã¯ã€Œ(クラスå) classã€ã€ãƒ¡ã‚¿ã‚¯ãƒ©ã‚¹è‡ªèº«ã‚’指ã™ã¨ãã¯ã€Œã‚¯ãƒ©ã‚¹å classã€ã¨ã—ã¦ã‚ã‚Šã¾ã™ã€‚
メタクラスã¯äº’ã„ã«ã€å„々ã«å±žã™ã‚‹ã‚¯ãƒ©ã‚¹ã®ç¶™æ‰¿é–¢ä¿‚を自身ãŸã¡ã‚‚模ã—ãŸç¶™æ‰¿é–¢ä¿‚ã«ã‚ã‚Šã¾ã™ã€‚ã¤ã¾ã‚Šã€ByteString ã‚„ Person ㌠Object ã®ã‚µãƒ–クラスã§ã‚るよã†ã«ã€ByteString class ã‚„ Person class 㯠Object class ã®ã‚µãƒ–クラスã§ã™ã€‚
メタクラスもオブジェクトãªã®ã§å±žã™ã‚‹ã‚¯ãƒ©ã‚¹ã‚’æŒã¡ã¾ã™ã€‚Smalltalk ã§ã¯ Metaclass ã¨ã„ã†ã‚¯ãƒ©ã‚¹ãŒãã‚Œã§ã€ã™ã¹ã¦ã®ãƒ¡ã‚¿ã‚¯ãƒ©ã‚¹ã¯ Metaclass ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã™ã€‚Metaclass もクラスãªã®ã§ Metaclass class ã¨ã„ã†ã‚¯ãƒ©ã‚¹ã«å±žã—ã¾ã™ãŒã€ã“ã‚Œã¯ãƒ¡ã‚¿ã‚¯ãƒ©ã‚¹ã§ã‚‚ã‚ã‚‹ã®ã§ Metaclass ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã™ã€‚二階 三階 建ã¦ã®ã¨ãã« Class ãŒè‡ªèº«ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã‚る「ループã€ã¯ã€ Metaclass 㨠Metaclass class ãŒäº’ã„ã«äº’ã„ã®ã‚¯ãƒ©ã‚¹ã§ã‚りインスタンスã§ã‚ã‚‹ã¨ã„ã†ã‹ãŸã¡ã§ç¾ã‚Œã¾ã™ã€‚