简短的回答是"您假设类是系统范围的类的实例是错误的,每个类实际上是类特定元类的实例",并且"它不会以任何其他方式工作".
对答案的略微修改是"名字真的令人困惑,有时候更容易记住他们的角色,而不是过多考虑他们的工作方式".
短毛的回答:
Metaclass是一个实例,就像所有其他普通的Smalltalk类一样,它需要它自己的专用类.常规Smalltalk对象的每个实例都有一个类,其继承遵循类层次结构.每个类本身都是类特定元类的实例,其继承遵循元类层次结构.每个元类本身都是Metaclass类的一个实例,它被虚拟机在一个简洁的小技巧中短路,因为没有人发现使用Metaclass类作为父类,并且所有尝试过的人一般都发现他们的理智在这个过程中开始腐蚀.
更长,仍然毛茸茸的回答:
Smalltalk允许每个类包含特定于类的消息.这些与Java中的静态方法大致相同 - 但有一些显着的差异.其中一个区别是Smalltalk类实际上是实例化对象 - 它们是系统中的活动对象,具有从其他对象继承的能力,并包含实例变量.
此属性导致系统中存在大量继承层次结构.常规对象每个都是一个Class的实例,消息发送到搜索对象类的对象,然后跟随Class层次结构的继承链.发送到常规对象的消息将在Class层次结构中解析.
此外,类对象是一个特定于类的Metaclass的每个实例.发送到类对象的消息通过查找特定于类的元类,然后在元类层次结构上向上解析.
再增加一层,元类对象每个都是系统范围内唯一的Metaclass类的实例.发送到元类对象的消息在系统范围内的唯一Metaclass中查找,不允许从任何人继承,并且硬连接为VM中的短路.
从技术上讲,系统有两个继承层次结构,第三个是短路伪造的.虽然有很多实际的理由,但没有理论上的理由停在两点.这允许每个对象拥有它自己的,对象唯一的消息,每个类拥有它自己,类唯一,消息,并强制所有元类只回答在Metaclass中定义的一组消息.
整洁,对吧?
| 归档时间: |
|
| 查看次数: |
846 次 |
| 最近记录: |