Smalltalk向班级发送消息?

Smalltalk向班级发送消息?,smalltalk,pharo,Smalltalk,Pharo,我注意到在ProfStef的教程中,有时消息被发送到类而不是对象。我知道类也是对象,但是如果我没有首先创建类的实例,类如何查找方法呢?这些方法是在类级别定义的吗?类似于Java的静态方法吗?正如您所指出的,每个类也是一个对象。若你们评估和检查这个物体,你们会看到它。您还可以查找类的类:对象类。它是元类的一个实例,与任何其他行为一样,它有一个方法字典,因此它的实例i。E类对象可以响应消息 在系统浏览器中查看类时,可以在实例方法和类方法之间切换视图。类端的消息可以直接发送给类 Java中的静态方法与

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

正如您所指出的,每个类也是一个对象。若你们评估和检查这个物体,你们会看到它。您还可以查找类的类:对象类。它是元类的一个实例,与任何其他行为一样,它有一个方法字典,因此它的实例i。E类对象可以响应消息

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

Java中的静态方法与Smalltalk中的类方法相似,但它们并不完全相同。例如,您不能覆盖Java中的静态方法。在Smalltalk中,您可以重写子类中的类方法。您将看到系统中的某些类覆盖了新的。这是因为元类就像普通类一样从彼此继承。元类层次结构与类层次结构平行:集合是对象的子类,集合类是对象类的子类。因此,集合类方法可以重写对象类方法。在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中的消息send self bar将由元类B发送,因为您将foo消息发送给了B。由于B类像上面那样重新定义了方法栏,它将调用B的类方法,而不是A的类方法,因此打印B

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