Language agnostic 为什么有些语言有元类?
我看到Java只有一个元类(Class),但是其他语言,比如Smalltalk,每个类都有一个元类Language agnostic 为什么有些语言有元类?,language-agnostic,metaclass,Language Agnostic,Metaclass,我看到Java只有一个元类(Class),但是其他语言,比如Smalltalk,每个类都有一个元类 为什么呢?元类的需求是什么?以这样或那样的方式拥有它们有什么区别?至少需要一个元类的基本需求是,如果希望对象表示类(或希望类是对象),那么这些对象必须具有类型 维基百科说: 在早期的Smalltalks中,只有一个元类叫做Class。这 这意味着所有类的方法都是相同的,尤其是 创建新对象的方法,即new。允许类具有 它们自己的方法和实例变量(称为类 实例变量,不应与类变量混淆), Smalltal
为什么呢?元类的需求是什么?以这样或那样的方式拥有它们有什么区别?至少需要一个元类的基本需求是,如果希望对象表示类(或希望类是对象),那么这些对象必须具有类型 维基百科说: 在早期的Smalltalks中,只有一个元类叫做
Class
。这
这意味着所有类的方法都是相同的,尤其是
创建新对象的方法,即new
。允许类具有
它们自己的方法和实例变量(称为类
实例变量,不应与类变量混淆),
Smalltalk-80为每个类C
引入了他们自己的元类C类
因此,问题是,您希望每个类对象都具有相同的类型(因此也具有相同的成员),还是希望类对象在要求它们具有不同类型的方式上有所不同,以便可以在表示类A的对象上执行类型检查操作,但不能在表示类B的对象上执行类型检查操作?Java和早期的Smalltalks对这个问题的回答与后来的Smalltalks不同
因此,例如java.lang.Class.newInstance()
不接受构造函数参数,而您可以想象,能够调用clz可能会更好。newInstance(1)
其中clz
是一个类的类对象,该类的构造函数取int
。在Java中,您仍然可以自己查看类的构造函数,以找到要传递的参数的匹配项,但是类对象的类型不能告诉您是否会找到匹配项
还请注意,Smalltalk只在一个级别停止。C
的类型是C类
,但是C类
的类型是元类
。不存在类型的无限递归C class
等,因为尽管Smalltalk中不同的类对象接受不同的消息,但不需要不同的元类对象接受不同的消息