Smalltalk向Class发送消息



我在ProfStef的教程中注意到,有时会将消息发送到类而不是对象。我知道类也是对象,但如果我没有首先创建类的实例,类怎么能查找方法呢?这些方法是在类级别定义的吗?类似于Java的静态方法吗?

正如您所指出的,每个类也是一个对象。如果你评估和检查Object,你会看到它。你也可以查找一个类的类:Object class。它是Metaclass的一个实例,它和其他Behavior一样有一个方法字典,因此它的实例(即类对象(可以响应消息。

在系统浏览器中查看类时,可以在实例方法和类方法之间切换视图。类侧的消息可以直接发送到类。

Java中的静态方法与Smalltalk中的类方法相似,但它们并不完全相同。例如,您不能重写Java中的静态方法。在Smalltalk中,您可以覆盖子类中的类方法。您将看到系统中的一些类覆盖new。这是因为元类像普通类一样相互继承。元类层次结构与类层次结构平行:CollectionObject的子类,Collection classObject class的子类。因此,Collection类方法可以覆盖Object类方法。在Java中,不能依赖于静态方法之间的多态性。

例如,您希望打印什么:

public class Main {
public static void main(String[] args) {
B.foo();
}
}
class A {
public static void foo() {
System.out.println(bar());
}

public static String bar() {
return "A";
}
}
class B extends A {
public static String bar() {
return "B";
}
}

它将打印";A";。A.foo中bar()的调用是硬连接到A.bar.的

如果你在Smalltalk中用类方法写同样的东西,那么A.foo中的消息sendself bar将由B的元类调度,因为你把foo消息发送给了B。由于B类像上面一样重新定义了方法bar,它将调用B的类方法,而不是A的类方法;B";。

这种差异的另一个症状是,不能在Java的静态方法中使用this

相关内容

  • 没有找到相关文章

最新更新