まとめ:図形の階層構造
CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 36/70。
チャレンジ
簡単ゼロから完全な図形の継承構造を構築しましょう!すべての図形が継承する Shape 親クラスを作成し、次に共通の機能を共有しながら独自のプロパティを持つ Circle と Square の子クラスを作成します。
コードは4つのファイルに分けて構成します:
Shape.lua: すべての図形が継承するベースクラスです。図形の色を保存する:new(color)コンストラクタと、それを返す:getColor()メソッドを持つ必要があります。この共有プロパティにより、円であれ正方形であれ、すべての図形が色を持つことになります。Circle.lua: Shape を継承する子クラスです。その:new(color, radius)コンストラクタは、色の処理のために親コンストラクタを呼び出し、その後、独自の属性として半径を追加する必要があります。円の詳細を出力する:describe()メソッドを含めてください。Square.lua: Shape を継承するもう一つの子クラスです。その: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')
-- 円の入力を読み込む (色,半径)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)
-- 正方形の入力を読み込む (色,一辺の長さ)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)
-- TODO: 指定された色と半径で Circle インスタンスを作成する
-- TODO: 指定された色と一辺の長さで Square インスタンスを作成する
-- TODO: 円に対して :describe() を呼び出す
-- TODO: 正方形に対して :describe() を呼び出す
-- TODO: :getColor() を使用して円の色を表示する
-- TODO: :getColor() を使用して正方形の色を表示する