Javaにはメタクラス(Classクラス)が1つしかないようですが、Smalltalkなどの他の言語では、クラスごとに1つのメタクラスがあります。
何故ですか?メタクラスの必要性は何ですか?それらを何らかの方法で持つことはどのような違いをもたらしますか?
Javaにはメタクラス(Classクラス)が1つしかないようですが、Smalltalkなどの他の言語では、クラスごとに1つのメタクラスがあります。
何故ですか?メタクラスの必要性は何ですか?それらを何らかの方法で持つことはどのような違いをもたらしますか?
少なくとも1つのメタクラスの基本的な必要性は、クラスを表すオブジェクトが必要な場合(またはクラスをオブジェクトにする場合)、それらのオブジェクトは型を持っている必要があるということです。
ウィキペディアによると:
初期のSmalltalksでは、と呼ばれるメタクラスは1つしかありませんでし
Class
た。これは、すべてのクラスが持っているメソッド、特に新しいオブジェクトを作成するメソッド、つまり、が同じであることを意味しますnew
。クラスが独自のメソッドと独自のインスタンス変数(クラスインスタンス変数と呼ばれ、クラス変数と混同しないでください)を持つことができるようにするために、Smalltalk-80は各クラスC
に独自のメタクラスを導入しましC class
た。
したがって、問題は、すべてのクラスオブジェクトに同じ型(したがって同じメンバー)を持たせたいのか、それともクラスオブジェクトに異なる型を持たせる必要がある方法で異なるようにして、型チェック操作が行われるようにするのかということです。クラスAを表すオブジェクトでは実行できますが、クラスBを表すオブジェクトでは実行できません。Javaと初期のSmalltalksは、後のSmalltalksとは異なる方法でその質問に答えました。
したがって、たとえば、コンストラクター引数を取りませんが、コンストラクターを持つクラスのクラスオブジェクトがどこjava.lang.Class.newInstance()
にあるかを呼び出すことができると便利な場合があります。Javaでも、クラスのコンストラクターを自分で調べて、渡したい引数に一致するものを見つけることができますが、クラスオブジェクトのタイプでは、引数が見つかるかどうかはわかりません。clz.newInstance(1)
clz
int
また、Smalltalkは1つのレベルで停止することに注意してください。のタイプはC
ですC class
が、のタイプはC class
ですMetaclass
。C class class
Smalltalkの異なるクラスオブジェクトは異なるメッセージを受け入れますが、異なるメタクラスオブジェクトが異なるメッセージを受け入れる必要はないため、型などの無限の再帰はありません。