Smalltalkでのメタクラスとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > Smalltalkでのメタクラスの意味・解説 

Smalltalkでのメタクラス

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/06 12:23 UTC 版)

メタクラス」の記事における「Smalltalkでのメタクラス」の解説

Smalltalkでは全てオブジェクトである。また、Smalltalkクラスベースであるため、オブジェクトは必ず、そのオブジェクト構造端的にはそのオブジェクト有するインスタンス変数)や、そのオブジェクトがどんなメッセージ理解するのか(端的にコールできるメソッド)を定義したいずれかクラスに属さなければならない。このルールにおいてクラス例外ではなくSmalltalkではクラスオブジェクトであり、同時に別のクラスインスタンスでもある。このクラスクラス、つまりあるクラス属す特殊なクラスが「メタクラス」である。 例えば、「自動車クラスCarから生成されオブジェクトaCarが、Carインスタンスであり、Carというクラス属しているのと同じように、クラスCar自身にも自らが属しているクラス、つまりメタクラス存在する原則としてSmalltalkメタクラス無名扱いだが、便宜的にクラス名class付して呼称する慣習がある。Carなら、そのメタクラスCar classである。なおこの表記は(クラス限らず)あるオブジェクト属すクラス第一級オブジェクトとして得るためのSmalltalkとしての意味も併せ持つaCar class "=> Car ". (aCar class) class "=> Car class ")。 クラスメソッド(クラスコールできるメソッド)は、通常メタクラス定義されている。これはインスタンスメソッドがクラス定義されているのと考え方は同じである。 インスタンスメソッドの場合、たとえば整数の「2」というオブジェクト何らかのメッセージを送ると、2が属するSmallIntegerというクラスから対応するメソッドがないか探し始める。SmallIntegerに見つからなければそのスーパークラスであるIntegerで…というようにスーパークラス次々と手繰ってゆき、最後Objectというルートクラスまで探索続ける。 クラスメソッドの場合考え方はほとんど変わらない。たとえばSmallIntegerというクラスに対してメッセージを送ると、メソッド検索はそのクラスであるSmallInteger classから開始される。そしてインスタンスメソッドの場合同様に、SmallInteger classスーパークラスであるInteger class、さらにそのスーパークラス次々と手繰りObject classObjectクラスメタクラス)まで探索続ける。なおSmalltalkにおいてはメタクラス継承関係は原則としてそのインスタンスであるクラス継承関係と一致する。つまりSmallIntegerのスーパークラスIntegerなら、そのメタクラス同士も同じ関係、すなわち、SmallInteger classスーパークラスInteger classである。ただしObject classだけは例外で、Objectスーパークラス未定義(nil)であるのに対しObject classスーパークラスClass定められている。したがってクラスへのメッセージ送信に伴うメソッド探索Object classでは終了せず、クラスとしての振る舞い定めたClassとそのスーパークラスパスにある二つクラス(ClassDescriptionとBehavior後述)を経てObject行き着くまで続行される同時にこのことはSmalltalkにおいてクラスオブジェクトである、すなわちクラスObjectの(サブインスタンスであり、通常のクラスインスタンス同様Object定義されメソッドコールできること理由をうまく説明している。 初期Smalltalk(Smalltalk-76)には、同じくClass名付けられたたったひとつのメタクラスしか用意されていなかった。つまりこのことは、すべてのクラスClassインスタンスであり、他のクラスと同じ共通のメソッドか持つことができなかった(たとえば、新しインスタンス作るためのnewというメソッドなど)ということ意味するその後クラスが独自のメソッド(クラスメソッド)やインスタンス変数(クラスインスタンス変数呼ばれるクラスとそのインスタンス共有できるクラス変数混同されやすいが別物である)を持てるように、Smalltalk-80では改めクラスそれぞれ固有のメタクラス生成されるように拡張され今のかたちになったクラスクラスであるメタクラスは、インスタンスクラスである通常のクラスほどには独自性要求されないので、すべてのメタクラスMetaclassという名のひとつクラスインスタンスとして位置づけられている。ちなみにMetaclassメタクラスMetaclass classだが、同時にこれは前述ルール則りMetaclassインスタンスでもある。このトリックによって、さらにメタ、さらにそのメタ…と永遠に繰り返さずにも済むようになっている。 メタクラスクラス生成時に同時に生成される。より具体的には、あるクラス将来スーパークラスに対して、そのサブクラスとして例えFoo生成するように命ずると、まず暗黙のうちにFoo class生成され、そのインスタンスとしてFoo生成される先に述べたメタクラス無名であり、クラスブラウザのクラス一覧にも現れえない。しかし、メタクラスが必ずクラスペア生成されることを利用して、クラスブラウザではclassボタン古典的なクラスブラウザではクラス一覧表示する設置されている)を押して表示切り替えることで対応するメタクラスの定義にアクセスしたりその内容(クラスインスタンス変数やクラスメソッド)を編集可能になっている。

※この「Smalltalkでのメタクラス」の解説は、「メタクラス」の解説の一部です。
「Smalltalkでのメタクラス」を含む「メタクラス」の記事については、「メタクラス」の概要を参照ください。

ウィキペディア小見出し辞書の「Smalltalkでのメタクラス」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

Smalltalkでのメタクラスのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Smalltalkでのメタクラスのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaのメタクラス (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS