📄 ch03s05.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>5. 网络版猜数字游戏</title><link rel="stylesheet" href="html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.69.1"><link rel="start" href="index.html" title="Java网络程序员看Continuation"><link rel="up" href="ch03.html" title="Chapter 3. Seaside框架"><link rel="prev" href="ch03s04.html" title="4. 部件之间的call和answer"><link rel="next" href="ch04.html" title="Chapter 4. Continuation的实现"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">5. 网络版猜数字游戏</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s04.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Seaside框架</th><td width="20%" align="right"> <a accesskey="n" href="ch04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e388"></a>5. 网络版猜数字游戏</h2></div></div></div><p>看过了简单的call/answer的例子,我们现在来重新写本文开头的猜数字游戏,看看continuation可以达到怎样的效果。</p><p>我们首先写一个WAComponent的子类WANumberInput,用来向用户询问一个数字。注意这个部件完全不用理会猜数字这个游戏,所以它会很容易重复使用。</p><pre class="programlisting">WAComponent subclass: #WANumberInput instanceVariableNames: 'number' classVariableNames: '' poolDictionaries: '' category: 'Seaside-Examples-Test'</pre><p>该类有三个方法,分别如下:</p><pre class="programlisting">number ^ numbernumber: aNumber number _ aNumberrenderContentOn: html html form: [ html textInputOn: #number of: self. html submitButtonWithAction: [self answer: number] text: 'Return']</pre><p>用类似Java的语法写出来就是:(下面的代码不是任何语言)</p><pre class="programlisting">public class WANumberInput extends WAComponent{ private Object number; public Object getNumber() { return number; } public void setNumber(Object aNumber) { number = aNumber; } public void renderContentOn(Object html) { html.beginForm(); html.textInput(); // 该textInput与this.number相联系 html.submitButton(‘Return’); // 用onButtonClicked函数处理button click事件 html.endForm(); } public void onButtonClicked() { this.answer(number); }}</pre><p>该部件的作用是显示下面的页面。当用户按下Return键时,该部件会answer调用自己的部件,并将用户的输入作为返回值。</p><div class="screenshot"><div class="mediaobject"><img src="resources/number-input.png"></div></div><p>很简单,很干净的一个部件,不是吗?现在我们看看如何使用它。我们新创建一个WATask的子类,WAGuessNum。</p><pre class="programlisting">WATask subclass: #WAGuessNum instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Seaside-Examples-Test'</pre><p>WATask本身是WAComponent的一个子类,它是WAComponent最重要的子类之一。与普通的WAComponent不同,WATask没有renderContentOn函数,不过它有另一个函数go。WATask从来不显示自己,也就是说,它会一直call其它部件,一个部件answer后它会立即call另一个部件。WATask自身只负责逻辑而不是显示。</p><p>我们的WAGuessNum只有一个instance method,也就是go。代码如下:</p><pre class="programlisting">go | answer win guess numinput | answer _ Random new nextInt: 100. win _ false.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -