gpt4 book ai didi

Smalltalk 向类(class)发送消息?

转载 作者:行者123 更新时间:2023-12-02 02:35:24 25 4
gpt4 key购买 nike

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

最佳答案

正如您所注意到的,每个类也是一个对象。如果您评估并检查Object,您就会看到它。您还可以查找类的类:Object class。它是 Metaclass 的一个实例,它像任何其他行为一样具有方法字典,因此它的实例(即类对象)可以响应消息。

在系统浏览器中查看类时,可以在实例方法和类方法之间切换 View 。类(class)端的消息您可以直接发送到类(class)。


Java 中的静态方法与 Smalltalk 中的类方法很相似,但并不完全相同。例如,您不能覆盖 Java 中的静态方法。在 Smalltalk 中,您可以重写子类中的类方法。您将看到系统中的一些类覆盖new。这是有效的,因为元类像常规类一样相互继承。元类层次结构与类层次结构平行:CollectionObject 的子类,Collection 类Object 类的子类。因此,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 中的消息发送 self bar 将由 B 的元类分派(dispatch),因为您将 foo 消息发送给 B。像上面一样重新定义方法 bar ,它会调用 B 的类方法,而不是 A 的类方法,因此打印“B”。

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

关于Smalltalk 向类(class)发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64402195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com