まとめ:図形の階層構造
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 36/70。
チャレンジ
簡単完全な図形の階層構造をゼロから構築しましょう!すべての図形が継承するShape親クラスを作成し、それぞれが固有のプロパティを持ちながら共通の機能を共有するCircleとSquareの子クラスを構築します。
コードを4つのファイルに分けて整理します。
Shape.lua:すべての図形が継承する基底クラスです。図形の色を保存する:new(color)コンストラクターと、色を返す:getColor()メソッドを持つ必要があります。この共有プロパティにより、円でも正方形でも、すべての図形が色を持つことになります。Circle.lua:Shapeを継承する子クラスです。その:new(color, radius)コンストラクターは、色について親コンストラクターを呼び出し、その後、半径を固有の属性として追加します。円の詳細を出力する:describe()メソッドも含めてください。Square.lua:Shapeを継承するもう1つの子クラスです。その:new(color, side)コンストラクターも親コンストラクターを呼び出し、その後、一辺の長さを保存します。正方形用の:describe()メソッドも含めてください。main.lua:両方の図形のインスタンスを作成し、Shapeを正しく継承しながら固有のプロパティを維持していることを示して、すべてをまとめます。
2つの入力を受け取ります。
- 円のデータ:色と半径をコンマで区切ったもの(例:
blue,5) - 正方形のデータ:色と一辺の長さをコンマで区切ったもの(例:
red,4)
メインファイルで、指定された値を使ってCircleとSquareを作成します。その後、次の内容をそれぞれ別の行に出力します。
- 円に対して
:describe()を呼び出す - 正方形に対して
:describe()を呼び出す :getColor()を使って円の色を出力する:getColor()を使って正方形の色を出力する
Circleの:describe()メソッドは、次のように出力します。
Circle with radius {radius}Squareの:describe()メソッドは、次のように出力します。
Square with side {side}たとえば、入力がblue,5とred,4の場合、出力は次のようになります。
Circle with radius 5
Square with side 4
blue
redこれは完全な継承パターンを示しています。どちらの図形もShapeから:getColor()を継承し(自分自身では決して定義しません)、それぞれが独自の属性と:describe()メソッドを持っています。
自分で試してみよう
-- main.lua: すべてをまとめる
local Circle = require('Circle')
local Square = require('Square')
-- 円の入力を読み取る (color,radius)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)
-- 正方形の入力を読み取る (color,side)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)
-- TODO: 指定された color と radius で Circle インスタンスを作成する
-- TODO: 指定された color と side で Square インスタンスを作成する
-- TODO: circle に対して :describe() を呼び出す
-- TODO: square に対して :describe() を呼び出す
-- TODO: :getColor() を使って circle の color を出力する
-- TODO: :getColor() を使って square の color を出力する
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ