まとめ:ロボットの組み立て
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 54/70。
チャレンジ
簡単個別のコンポーネント部品から Robot を組み立てましょう!継承を使う代わりに、それぞれ固有の特化した動作を持つ、別々の Arm、Leg、Head オブジェクトを組み合わせてロボットを構築します。ロボットは委譲を通じてこれらの部品を連携させます。
コードは5つのファイルに分けて整理します。
Arm.lua::new(side)コンストラクターを持つ Arm クラスを作成し、どちら側にあるか(例: "left" または "right")を保存します。{side} arm raisedを出力する:raise()メソッドと、{side} arm loweredを出力する:lower()メソッドを含めます。Leg.lua::new(side)コンストラクターを持つ Leg クラスを作成し、側を保存します。{side} leg steps forwardを出力する:step()メソッドを含めます。Head.lua::new()コンストラクターを持つ Head クラスを作成します。Head nodsを出力する:nod()メソッドと、Head shakesを出力する:shake()メソッドを含めます。Robot.lua::new(name)コンストラクターが名前を保存し、すべてのコンポーネント部品(left arm、right arm、left leg、right leg、head)を内部で作成する Robot クラスを作成します。Robot には、部品に委譲する次のメソッドを持たせます。:greet():{name} says hello!を出力し、次に右腕を上げ、その後で下げます:walk(): left leg を動かし、次に right leg を動かします:respond(answer): answer が"yes"の場合は head がうなずき、"no"の場合は head が首を振ります
main.lua: Robot の名前と yes/no の応答の入力を読み取ります。Robot を作成し、greet、walk を実行してから、入力に基づいて respond させます。
入力は2つ与えられます。
- Robot の名前(文字列)
- 応答:
yesまたはno
出力には、Robot が部品を連携させている様子が示されます。
{name} says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head nods応答が no の場合は次のようになります。
{name} says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head shakesたとえば、入力が Robo と yes の場合、出力は次のようになります。
Robo says hello!
right arm raised
right arm lowered
left leg steps forward
right leg steps forward
Head nodsRobot は、腕をどのように上げたり、脚をどのように動かしたりするかを知らないことに注目してください。Robot は各部品に何をすべきかを伝えるだけです。それぞれのコンポーネントは独立していて再利用可能であり、Robot はそれらをすべてまとめるコーディネーターとして機能します。
自分で試してみよう
-- main.lua: ロボットコンポジションチャレンジのエントリーポイント
local Robot = require('Robot')
-- 入力を読み取る
local name = io.read()
local answer = io.read()
-- TODO: 指定された名前でRobotを作成する
-- TODO: ロボットに挨拶させる
-- TODO: ロボットに歩かせる
-- TODO: answer入力に基づいてロボットに応答させる
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ