如何在 Smalltalk 中访问类变量



我正在尝试访问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 minuteStartEndTime具有以下变量: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.

相关内容

  • 没有找到相关文章

最新更新