微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Pharo中更改类的实例变量?

如何解决如何在Pharo中更改类的实例变量?

我创建了一个名为Die(Dice的单数)的类,并设置了一个实例变量side

Object subclass: #Die
    instanceVariableNames: 'side'
    classVariableNames: ''
    package: 'MyPackage'

认将side变量初始化为6:

initialize

 side := 6. 

但是我希望能够在创建对象之后更改实例变量,就像这样:

myDie := Die new.
myDie side: 10. " it doesn't to work "

在我看来,实例变量只能由类方法更改。有没有办法像上面一样更改它?

此外,我有一个方法roll,该方法返回一个介于1和指定边之间的随机数。如果我创建两个骰子,并且想同时掷两个骰子,或者可能想同时掷三个骰子,那么我应该创建一个不同的类,例如papercup用骰子的数量喂食并实现掷骰方法是在纸杯上吗?

谢谢。

解决方法

您在正确的轨道上。执行时

myDie side: 10.

您向side:发送消息myDie,该消息是类Die的实例。为了“响应”此消息,类die(或其超类)应实现side:方法。理想情况下,此方法应如下所示:

side: aNumber

    side := aNumber

您看到,非常重视封装,因此实例变量只能由对象本身直接访问,而不能由外部任何人直接访问。这就是为什么您总是必须创建访问器的原因,这是许多编程语言在不同程度上都遵循的一种很好的做法。

关于第二个问题:拥有Papercup类是一个好主意,但是如果您不需要广泛的功能,则可以通过以下代码来完成确切的任务:

papercup := OrderedCollection new.
papercup
    add: die1;
    add: die2;
    add: die3.
papercup collect: #roll

这样,您将滚动所有3个管芯并返回3个数字的集合(collect:map()在许多编程语言中相同)。我提供了一个简化版本,而编写收集的完整方法是:papercup collect: [ :die | die roll],当您指定一个完整的块(闭包)并将roll消息发送到每个模具时。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。