繁体   English   中英

如何在Smalltalk中访问类变量

[英]How to access class variables in Smalltalk

我试图在Smalltalk的一个类中访问一个类变量。

我有两个类:Class1和Class2。

Class1具有以下变量:年月日小时分钟。 Class2具有以下变量:start-time end-time。 在Class2的initialize方法中,我有以下内容:

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

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

既然你发送new消息类我会假设你有兴趣的实例变量 ,而不是类变量 (共享变量)(见菲罗对象模型更新菲罗通过实例来理解的差异)。

在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'不是有效的变量名。

我试图在Smalltalk的一个类中访问一个类变量。

你确定在这种情况下你想要Class变量吗? 一个Class变量(或属性只保存一次。该类的所有实例都可以访问它,所有子类的所有实例都可以访问,并且子类本身也可以访问它。

如果你想要的是产生许多对象,每个对象注意到不同的时间,或者startTime和endTime,那么你需要使用更普通的实例变量。

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

我有两个类:Class1和Class2。

我将Class1称为“ Time ”,我将Class2称为“ StartEndTime

时间有以下变量: year month day hour minute StartEndTime具有以下变量: startTime endTime StartEndTime的initialize方法中,我有以下内容:

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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM