最終 OOP チェック
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 70/70。
チャレンジ
簡単Lua の OOP について学んだことをすべてまとめましょう!継承、命名規則によるカプセル化、オプション機能のための mixin を示す車両システムを構築します。
コードを 5 つのファイルに分けて整理します。
Vehicle.lua: すべての車両の Base class。各車両にはnameと、private-convention に従う_speed(0 で初期化)が含まれます。:getName()getter、:getSpeed()getter、および負の値を拒否する:setSpeed(value)setter を実装します(負の場合はSpeed cannot be negativeを出力し、値を変更しません)。"{name} moving at {speed}"を返す:describe()method を追加します。Refuelable.lua: fuel 関連の behavior を含む mixin table。self._fuelに加算する:refuel(amount)method と、current fuel level を返す:getFuel()method を実装します。Car.lua: Vehicle を Inherits し、Refuelable mixin を使用します。constructor はnameを受け取り、_fuelを 0 に初期化します。"{name} moving at {speed}, fuel: {fuel}"を返すように:describe()を override します。Refuelable mixin を Apply して、car に fuel capabilities を与えます。Bicycle.lua: Vehicle のみを Inherits します。fuel functionality は必要ありません。constructor はnameだけを受け取ります。Bicycle は inherited:describe()method を modification せずに使用します。main.lua: すべてをまとめます!inputs に基づいて car と bicycle を Create し、それぞれの異なる capabilities を示しながら、共通する vehicle behavior を共有しつつ distinct features を持つことを示します。
4 つの inputs を受け取ります。
- Car name
- Bicycle name
- 両方の vehicle に設定する Speed(数値)
- car に追加する fuel amount(数値)
main file では次の処理を行います。
- given names で car と bicycle を Create します
- third input を使用して両方の vehicle の speed を設定します
- fourth input で car に Refuel します
- car の description を Print します
- bicycle の description を Print します
たとえば、inputs が Sedan、Mountain Bike、60、45 の場合、出力は次のようになります。
Sedan moving at 60, fuel: 45
Mountain Bike moving at 60inputs が Sports Car、Road Bike、120、80 の場合、出力は次のようになります。
Sports Car moving at 120, fuel: 80
Road Bike moving at 120この challenge では、継承によって shared behavior(both vehicle は move できます)が提供され、mixin によって optional capabilities(fuel が必要なのは car だけ)が追加され、encapsulation によって data integrity(speed validation)が保護される仕組みを示します。それぞれの technique は、design において異なる目的を果たします。
自分で試してみよう
-- 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: 自転車の説明を出力する
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ