Smalltalk 中定义的类变量在哪里?

EL_*_*L_9 4 smalltalk

我想知道,如果我定义一个新的类变量,例如为 class MyClass,定义是 inMyClass还是 in MyClass class?不MyClass class知道有关新类变量?

Lea*_*lia 5

是的,类变量与类和元类共享。它们还与所有子类(及其元类)共享。类变量通常大写,以更好地传达在比类更广泛的范围内共享的想法。您在类(而不是元类)中定义类变量。

类变量不应与类实例变量混淆,类实例变量是在元类级别定义的实例变量,即类对象的实例变量。尽管这个概念很简单(或正因为如此),但这个概念还是有些晦涩:实例变量总是在类中定义以定义其实例的形状(槽)。因此,如果我们将此定义应用于元类,即类的类,此处定义的实例变量定义其实例的形状,其中(通常)只有一个,即类。

回到类变量,在类(inst 端)中定义它们并在元类(即类端)中初始化它们。请记住,这些是(部分)全局变量,它们将在实例、子实例、子类和元类之间共享,因此必须像对待全局变量一样谨慎处理它们。


再澄清一项

当我们说实例变量在实例和子实例之间共享时,我们指的是它们的名称(以及对象槽在内存中的位置);我们不是指它们的值(所述插槽的内容)。因此,类的两个实例C将共享名称,例如color,如果类定义了 ivar color,但它们在每个实例中的值将是独立的。换句话说,它共享的是名称,而不是值。

对于类变量,共享的是名称和值。它实际上是Association对象,例如Theme -> aTheme,共享的内容。因此,对类变量值的任何修改都会影响其所有引用。类实例变量不是这种情况,因为它们只是实例变量,除了它们塑造类及其子类,而不是常规实例和子实例。


有关 Smalltalk 变量的更多信息,请参阅/sf/answers/2972240841/