为什么有些语言有元类?

时间:2012-11-05 12:27:07

标签: language-agnostic metaclass

我看到Java只有一个元类(Class类),但其他语言,比如Smalltalk,每个类都有一个元类。

为什么?元类需要什么?以某种方式让它们有什么不同?

1 个答案:

答案 0 :(得分:2)

至少有一个元类的基本需求是,如果你想要表示类的对象(或希望类对象),那么这些对象必须有一个类型。

维基百科说:

  

在早期的Smalltalks中,只有一个名为Class的元类。这个   暗示所有类的方法都是相同的,特别是   创建新对象的方法,即new。允许课程   他们自己的方法和他们自己的实例变量(称为类   实例变量,不应与类变量混淆),   Smalltalk-80为每个类C引入了他们自己的元类C class

所以问题是,你是否希望每个类对象具有相同的类型(因此具有相同的成员),或者你是否希望类对象以需要它们具有不同类型的方式不同,以便有类型 - 可以在表示类A但不在表示类B的对象上的对象上执行的检查操作? Java和早期的Smalltalks对这个问题的回答与后来的Smalltalks不同。

因此,例如java.lang.Class.newInstance()不接受构造函数参数,而您可以想象能够调用clz.newInstance(1)可能会很好,其中clz是具有类的对象需要int的构造函数。在Java中,您仍然可以自己查看类的构造函数,以找到要传递的参数的匹配项,但类对象的 type 不会告诉您是否会找到它。

另请注意,Smalltalk在一个级别停止。 C的类型为C class,但C class的类型为Metaclass。类型C class class等没有无限递归,因为尽管Smalltalk中的不同类对象接受不同的消息,但不需要不同的元类对象来接受不同的消息。