如何在 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.
我正在尝试访问 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 forStartEndTime
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.