最終 OOP チェック
CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 70/70。
チャレンジ
簡単LuaにおけるOOP(オブジェクト指向プログラミング)について学んだすべてをまとめましょう!継承、命名規則によるカプセル化、そしてオプション機能を付加するためのミックスインを実演する車両システムを構築します。
コードは5つのファイルに分けて構成します:
Vehicle.lua: すべての車両のベースクラスです。各車両はnameと、プライベートの慣習に従った_speed(0で初期化)を持ちます。:getName()ゲッター、:getSpeed()ゲッター、および負の値を拒否する:setSpeed(value)セッターを含めてください(負の値の場合、"Speed cannot be negative"と出力し、値は変更しないでください)。"{name} moving at {speed}"を返す:describe()メソッドを追加してください。Refuelable.lua: 燃料関連の振る舞いを含むミックスインテーブルです。self._fuelに加算する:refuel(amount)メソッドと、現在の燃料レベルを返す:getFuel()メソッドを含めてください。Car.lua: Vehicleを継承し、Refuelableミックスインを使用します。コンストラクタはnameを受け取り、_fuelを0で初期化します。:describe()をオーバーライドして、"{name} moving at {speed}, fuel: {fuel}"を返すようにします。Refuelableミックスインを適用して、車に燃料機能を持たせます。Bicycle.lua: Vehicleのみを継承します。燃料機能は必要ありません。コンストラクタはnameのみを受け取ります。自転車は、継承された:describe()メソッドを修正せずに使用します。main.lua: すべてをまとめます!入力に基づいて車と自転車を作成し、それらの異なる機能を示し、共通の車両の振る舞いを共有しながら、いかに異なる特徴を持っているかを示してください。
4つの入力を受け取ります:
- 車の名前
- 自転車の名前
- 両方の車両に設定する速度(数値)
- 車に追加する燃料の量(数値)
メインファイルでの手順:
- 与えられた名前で車と自転車を作成します
- 3番目の入力を使用して、両方の車両に速度を設定します
- 4番目の入力で車に燃料を補給します
- 車の説明を出力します
- 自転車の説明を出力します
例えば、入力が Sedan、Mountain Bike、60、45 の場合、出力は以下のようになります:
Sedan moving at 60, fuel: 45
Mountain Bike moving at 60入力が Sports Car、Road Bike、120、80 の場合、出力は以下のようになります:
Sports Car moving at 120, fuel: 80
Road Bike moving at 120このチャレンジは、継承が共有された振る舞い(両方の車両が移動できる)をどのように提供し、ミックスインがオプションの機能(車のみが燃料を必要とする)をどのように追加し、カプセル化がデータの整合性(速度のバリデーション)をどのように保護するかを示しています。それぞれのテクニックが、設計において異なる目的を果たしています!
自分で試してみよう
-- main.lua: すべてをまとめる
local Car = require('Car')
local Bicycle = require('Bicycle')
-- 入力を読み込む
local carName = io.read()
local bicycleName = io.read()
local speed = tonumber(io.read())
local fuelAmount = tonumber(io.read())
-- TODO: 指定された名前で車を作成する
-- TODO: 指定された名前で自転車を作成する
-- TODO: 両方の車両の速度を設定する
-- TODO: 指定された燃料量で車に給油する
-- TODO: 車の説明を表示する
-- TODO: 自転車の説明を表示する