【问题标题】:Why do some languages have metaclasses?为什么有些语言有元类?
【发布时间】:2012-11-05 12:27:06
【问题描述】:

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

这是为什么呢?对元类有什么需求?以一种或另一种方式拥有它们有什么不同?

【问题讨论】:

    标签: language-agnostic metaclass


    【解决方案1】:

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

    维基百科说:

    在早期的 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 的类型是MetaclassC class class 等类型没有无限递归,因为虽然 Smalltalk 中不同的类对象接受不同的消息,但并不要求不同的元类对象接受不同的消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2021-11-13
      • 2011-11-16
      • 2011-02-11
      • 2011-03-30
      相关资源
      最近更新 更多