【发布时间】:2012-11-05 12:27:06
【问题描述】:
我看到 Java 只有一个元类(Class 类),但其他语言,比如 Smalltalk,每个类都有一个元类。
这是为什么呢?对元类有什么需求?以一种或另一种方式拥有它们有什么不同?
【问题讨论】:
标签: language-agnostic metaclass
我看到 Java 只有一个元类(Class 类),但其他语言,比如 Smalltalk,每个类都有一个元类。
这是为什么呢?对元类有什么需求?以一种或另一种方式拥有它们有什么不同?
【问题讨论】:
标签: language-agnostic metaclass
对至少一个元类的基本需求是,如果您想要表示类的对象(或希望类成为对象),那么这些对象必须有一个类型。
维基百科说:
在早期的 Smalltalks 中,只有一个名为
Class的元类。这个 暗示所有类的方法都是相同的,特别是 创建新对象的方法,即new。允许类有 他们自己的方法和他们自己的实例变量(称为类 实例变量,不应与类变量混淆), Smalltalk-80 为每个类引入C他们自己的元类C class。
所以问题是,您是否希望每个类对象都具有相同的类型(因此具有相同的成员),或者您是否希望类对象在要求它们具有不同类型的方式上有所不同,以便有类型- 可以在代表 A 类的对象上执行但不能在代表 B 类的对象上执行的检查操作? Java 和早期的 Smalltalks 对这个问题的回答与后来的 Smalltalks 不同。
例如,java.lang.Class.newInstance() 不接受构造函数参数,而您可以想象能够调用 clz.newInstance(1) 可能会很好,其中 clz 是具有带 @ 构造函数的类的类对象987654328@。在 Java 中,您仍然可以自己查看类的构造函数来查找要传递的参数的匹配项,但是类对象的 type 并不能告诉您是否会找到。
还请注意,Smalltalk 只停留在一个级别。 C 的类型是C class,但C class 的类型是Metaclass。 C class class 等类型没有无限递归,因为虽然 Smalltalk 中不同的类对象接受不同的消息,但并不要求不同的元类对象接受不同的消息。
【讨论】: