2

Javaにはメタクラス(Classクラス)​​が1つしかないようですが、Smalltalkなどの他の言語では、クラスごとに1つのメタクラスがあります。

何故ですか?メタクラスの必要性は何ですか?それらを何らかの方法で持つことはどのような違いをもたらしますか?

4

1 に答える 1

2

少なくとも1つのメタクラスの基本的な必要性は、クラスを表すオブジェクトが必要な場合(またはクラスをオブジェクトする場合)、それらのオブジェクトは型を持っている必要があるということです。

ウィキペディアによると:

初期のSmalltalksでは、と呼ばれるメタクラスは1つしかありませんでしClassた。これは、すべてのクラスが持っているメソッド、特に新しいオブジェクトを作成するメソッド、つまり、が同じであることを意味しますnew。クラスが独自のメソッドと独自のインスタンス変数(クラスインスタンス変数と呼ばれ、クラス変数と混同しないでください)を持つことができるようにするために、Smalltalk-80は各クラスCに独自のメタクラスを導入しましC classた。

したがって、問題は、すべてのクラスオブジェクトに同じ型(したがって同じメンバー)を持たせたいのか、それともクラスオブジェクトに異なる型を持たせる必要がある方法で異なるようにして、型チェック操作が行われるようにするのかということです。クラスAを表すオブジェクトでは実行できますが、クラスBを表すオブジェクトでは実行できません。Javaと初期のSmalltalksは、後のSmalltalksとは異なる方法でその質問に答えました。

したがって、たとえば、コンストラクター引数を取りませんが、コンストラクターを持つクラスのクラスオブジェクトがどこjava.lang.Class.newInstance()にあるかを呼び出すことができると便利な場合があります。Javaでも、クラスのコンストラクターを自分で調べて、渡したい引数に一致するものを見つけることができますが、クラスオブジェクトのタイプでは、引数が見つかるかどうかはわかりません。clz.newInstance(1)clzint

また、Smalltalkは1つのレベルで停止することに注意してください。のタイプはCですC classが、のタイプはC classですMetaclassC class classSmalltalkの異なるクラスオブジェクトは異なるメッセージを受け入れますが、異なるメタクラスオブジェクトが異なるメッセージを受け入れる必要はないため、型などの無限の再帰はありません。

于 2012-11-05T12:38:42.323 に答える