如何在 Smalltalk 中访问 class 变量

How to access class variables in Smalltalk

我正在尝试访问 Smalltalk 中我的 classes 之一中的 class 变量。

我有两个 classes:Class1 和 Class2。

Class1 有以下变量:年月日时分。 Class2 有以下变量:start-time-end-time。 在 Class2 的初始化方法中,我有以下内容:

start-time := Class1 new.
end-time := Class1 new.

现在我想将2012年分配给开始时间,如何访问Class1对象开始时间中的年份变量?

由于您要向 classes 发送 new 消息,我假设您对 实例变量 感兴趣,而不是 class 变量(共享变量)(请参阅 Updated Pharo By Example 中的 Pharo 对象模型以了解差异)。

在 Pharo 中所有 class/instance 变量都是私有的,因此访问它们的方法是创建访问器。

添加到您的 Class1 方法

Class1>>year
    ^ year

Class1>>year: aYear
    year := aYear

然后您可以使用适当的值将消息发送到 class:

Class2>>initialize
    startTime := Class1 new.
    startTime year: 2012.

    "or by using a cascade"
    startTime := Class1 new
        year: 2012;
        yourself.

如果出于某种原因您需要在没有访问器的情况下访问变量,您可以使用元编程:

startTime instVarNamed: #year "meta-getter"
startTime instVarNamed: #year put: 2012 "meta-setter"

最后,'start-time' 不是一个有效的变量名。

I am trying to access a class variable in one of my classes in Smalltalk.

您确定在这种情况下需要 Class 个变量吗?一个 Class 变量(或 属性 只保存一次。该 Class 的所有实例及其所有子实例都可以访问它-类,以及子 类 自己可以访问。

如果你想要生成许多对象,每个对象都记录不同的时间,或者开始时间和结束时间,那么你需要使用更普通的实例变量。

但是,如果您想存储一次,并且只存储一次,那么是的,您可以将信息存储在 Class 本身中。

I have two classes: Class1 and Class2.

我会调用 Class1 "Time" 我会调用 Class2 "StartEndTime

Time has the following variables: year month day hour minute. StartEndTime has the following variables: startTime endTime. In the initialize method for StartEndTime I have the following:

startTime := Time new. endTime := Time new.

Now I want to assign the year 2012 to startTime, how do I access the year variable in the object startTime?

约定是 getter 访问器方法与属性同名。在这种情况下,时间对象实例将有一个 year getter 方法,该方法 return 是时间对象的年份。

startTime year 将 return 名为 year

的变量

类似地,setter 访问器方法与其属性同名,但后缀为“:

startTime year: 2012 然后会将名为 year 的变量设置为 2012.

将这些放入 initialize 方法将意味着:

StartEndTime >> initialize
"Returns an initialized StartEndTime"
    startTime := Time new.
    endTime := Time new.
    ^self

Time >> year: anInt
"Returns receiver with its year set to the year argument."
   year := anInt.
   ^self

在工作区(或游乐场)

"create a new StartEndTime instanceobject"
aStartEndTime := StartEndTime new initialize.
aStartEndTime startTime: 2012.