我正在尝试访问Smalltalk中我的一个类中的类变量。
我有两个类:Class1和Class2。
Class1具有以下变量:年月日小时分钟。 Class2具有以下变量:start-time end-time。 在Class2的initialize方法中,我有以下内容:
start-time := Class1 new.
end-time := Class1 new.
现在我想将2012年分配给开始时间,如何在Class1对象的启动时间中访问年份变量?
答案 0 :(得分:12)
由于您要向类发送new
消息,我将假设您对实例变量感兴趣,而不是类变量(共享变量)(请参阅Updated Pharo By Example中的Pharo对象模型以了解差异。)
在Pharo中,所有类/实例变量都是私有的,因此访问它们的方法是创建访问器。
添加到Class1方法
Class1>>year
^ year
Class1>>year: aYear
year := aYear
然后您可以使用适当的值将消息发送给班级:
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'
不是有效的变量名。
答案 1 :(得分:1)
我正在尝试访问Smalltalk中我的一个类中的类变量。
你确定在这种情况下你想要Class变量吗?一个类变量(或属性只保存一次。该类的所有实例都可以访问它,所有它的子类的所有实例都可访问,以及子类本身可以访问。
如果你想要的是产生许多对象,每个对象注意不同的时间,或者startTime和endTime,那么你需要使用更普通的实例变量。
但是,如果您想存储一次,而且只存储一次,那么您可以将信息存储在类本身中。
我有两个类:Class1和Class2。
我会打电话给Class1" Time "我会打电话给Class2" StartEndTime "
时间有以下变量:
year month day hour minute
。StartEndTime
具有以下变量:startTime endTime
。在StartEndTime
的初始化方法中,我有以下内容:
startTime := Time new. endTime := Time new.
现在我想将2012年分配给startTime,如何在对象startTime中访问year变量?
惯例是命名与属性同名的getter访问器方法。在这种情况下,Time对象实例将具有year
getter方法,该方法返回Time对象的年份。
startTime year
将返回名为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.