我正在尝试访问Smalltalk中的一个类变量。
我有两个班级:1 类和 2 类。
Class1 具有以下变量:年 月 日 小时 分钟。类 2 具有以下变量:开始时间结束时间。在 Class2 的初始化方法中,我有以下内容:
start-time := Class1 new.
end-time := Class1 new.
现在我想将 2012 年分配给开始时间,如何访问 Class1 对象开始时间中的年份变量?
由于您向类发送new
消息,我将假设您对实例变量感兴趣,而不是类变量(共享变量((请参阅更新的Pharo By Example中的Pharo对象模型以了解差异(。
在Pharo中,所有类/实例变量都是私有的,因此访问它们的方法是创建访问器。
添加到类 1 方法
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'
不是有效的变量名。
我正在尝试访问 Smalltalk 中的一个类中的类变量。
在这种情况下,您确定需要类变量吗? 类变量(或属性保留一次且仅保留一次。该类的所有实例及其所有子类的所有实例都可以访问它,也可以由子类本身访问。
如果你想要生成许多对象,每个对象都记录不同的时间,或者开始时间和结束时间,那么你需要使用更普通的实例变量。
但是,如果您想存储一次,并且只存储一次,那么是的,您可以将信息存储在类本身中。
我有两个班级:1 类和 2 类。
我将类 1 称为"时间",将类 2 称为">开始结束时间">
时间具有以下变量:
year month day hour minute
。StartEndTime
具有以下变量:startTime endTime
。在StartEndTime
的初始化方法中,我有以下内容:
startTime := Time new. endTime := Time new.
现在我想将 2012 年分配给 startTime,如何访问对象 startTime 中的年份变量?
约定是使用与属性相同的名称命名 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.