我们现在要完成 cookie monster 的定义。走个捷径我们不详细追踪整个过程,但是要在测试CookieMonster 的“顶层”行为的时候察看系统的状态。在一个真实的应用程序中最好在写每个方法的时候测试它们,但是空间的现实使我们不能演示这个方式。下图展示了一个正确的脚本,弹出一个通知器来响应它,查询我们“Clara”的使用。因为这不是系统知道的一个全局标识符,它要求指导如何解释它。因为它应当充任类CookieMonster 的一个新实例,我们确定了有关的选项。

下图在 CookieMonster 的 nag 方法上打开了一个浏览器并总结来 Clara醒来之后展现的事件序列。象希望的那样,它立即开始向我们唠叨要cookie。我们给了它一些,还故意的包含了一些其他的东西,它拒绝了不能消化的食物。

我们再次在检查器中察看这次盛宴的结果。Clara 的 hunger必须被设置为 2 个 cookie。它满足了并快速睡着了。注意因为Clara是全局定义的,它的状态保持打开以便进一步检查而我们可以继续进一步研究Clara 的胃,从相关的按钮菜单上重复的选择"inspect"。这展现了充当Clara 的胃的包被实现为一个字典,而食物‘cookie’出现了 2次的事实被存储为与这个键关联的一个数。检查接着“摸底”到数的级别,因为数是文字并且不能进一步检查了。

在我们最后的图中浏览器底部展示的 nag 方法包含一个 whileTrue: 循环,通过在 cookiemonster 的状态上的测试来守护它。在这个循环的内部它重复的要求一个‘cookie’。如果提供了一个,则吃掉它。拒绝任何其它的食物。一旦 monster是“吃饱了”则终止这个循环,于是它就睡觉了。第四个浏览器窗格的菜单现在允许我们浏览所有发送者,所有实现者,还有到类和实例变量的所有引用。这个功能经常很有用;例如,如果对方法头部的改变导致必需做消息发送到系统中其他什么地方的修改,则必须定位所有这些位置。

我们现在察看一下类 Monster 和 CookieMonster 的全部代码的总结。
类: Monster 超类: Object 类别: Sesame Street 实例变量: colour tummy
“这个 ABSTRACT 类实现一些普通结构和对不同类型的 monster通用的行为。”
动作 eat: someItem self tummy add: someItem
查询 isEmpty ^ self tummy isNil
访问 colour ^ colour colour: aSymbol colour := aSymbol tummy ^ tummy tummy: aCollection tummy := aCollection
初始化 initialize self colour: #green. self tummy: Bag new
“这里只有一个单一的类方法并且没有类变量。smalltalk”
建立 new ^ super new initialize
Cookie monster 继承自 Monster,但增加了一些它们自己的特殊行为。
类: CookieMonster 超类: Monster 类别: Sesame Street 实例变量: state hunger 私有
askForCookie ^ FillInTheBlank request: 'Give me cookie !!! (please)' complainAbout: anItem Transcript show: 'No want ', anItem printString. Transcript cr. self colour: #red isCookie: anItem " | serves as the OR operator" ^ ((anItem = 'cookie') | (anItem = #cookie))
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-28676-8.html
有没有给美帝抓住的内容
懂点哲学的小学生都知道世界上没有绝对的事
永远挺你