smalltalk - 如何更改 Pharo 中类的实例变量?
问题描述
我创建了一个名为Die
(骰子的单数)的类并设置了一个实例变量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
用骰子的数量喂它,然后在纸杯上实现 roll 方法?
谢谢你。
解决方案
你走在正确的轨道上。当你执行
myDie side: 10.
您发送一条消息side:
,myDie
该消息是一个类的实例Die
。为了“响应”这个消息,类 die(或其超类)应该实现一个side:
方法。理想情况下,此方法将如下所示:
side: aNumber
side := aNumber
你看,pharo非常重视封装,所以实例变量只能被对象本身直接访问,而不能被外部任何人访问。这就是为什么您总是必须创建访问器的原因,这是许多编程语言在不同程度上遵循的一种好习惯。
关于您的第二个问题:拥有 Papercup 类是个好主意,但如果您不需要广泛的功能,则可以通过以下代码完成确切的任务:
papercup := OrderedCollection new.
papercup
add: die1;
add: die2;
add: die3.
papercup collect: #roll
这样,您将滚动所有 3 个骰子并返回 3 个数字的集合(collect:
与map()
许多编程语言相同)。我提供了一个速记版本,而编写收集的完整方法是:papercup collect: [ :die | die roll]
当您指定一个完整的块(闭包)并将roll
消息发送到每个骰子时。
推荐阅读
- python - 如何将自定义用户模型添加到管理面板的用户部分 - django 3.1.1
- azure-devops-rest-api - 如何通过 AzureDevOps REST API 仅获取最新版本的包
- python - 是否可以从 url 编码帖子数据中停止 Python 请求库?
- excel - 使用列表框调用用户窗体时出现运行时错误
- coq - 从向量转换的列表等于从转换其类型的向量转换的列表
- nlp - OpenAI API 和 GPT-3,不清楚如何访问或设置学习/开发?
- android - 在 C 中运行 Android SU 命令
- ios - 我们可以使用单个证书发布多少个应用程序以及如何同时更新所有应用程序
- xamarin - 此客户已存在具有该路由号码和帐号的银行账户 Plaid+Stripe 例外
- r - Image not displayed in row of flextable on export ppt