Menu
Coddy logo textTech

最終 OOP チェック

CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 70/70。

challenge icon

チャレンジ

簡単

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 を受け取ります。

  1. Car name
  2. Bicycle name
  3. 両方の vehicle に設定する Speed(数値)
  4. car に追加する fuel amount(数値)

main file では次の処理を行います。

  1. given names で car と bicycle を Create します
  2. third input を使用して両方の vehicle の speed を設定します
  3. fourth input で car に Refuel します
  4. car の description を Print します
  5. bicycle の description を Print します

たとえば、inputs が SedanMountain Bike6045 の場合、出力は次のようになります。

Sedan moving at 60, fuel: 45
Mountain Bike moving at 60

inputs が Sports CarRoad Bike12080 の場合、出力は次のようになります。

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オンラインコンパイラ