Shapeコレクション
CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 59/70。
チャレンジ
簡単これで、完全な機能を備えた Rectangle クラスと Circle クラスの両方が揃いました。次に、複数の図形をまとめて管理できる ShapeCollection クラスを作成しましょう。これはコンポジション(合成)の素晴らしい例です。コレクションは図形「である」のではなく、図形を「持っている」のです。
成長を続けるプロジェクトに新しいファイルを追加します:
Shape.lua: ベースとなる Shape クラス(変更なし)。Rectangle.lua::getArea()と:getPerimeter()を持つ Rectangle クラス。Circle.lua::getArea()と:getPerimeter()を持つ Circle クラス。ShapeCollection.lua: 内部に図形を保存する新しいクラスを作成します。空の図形リストを初期化する:new()コンストラクタ、任意の図形をコレクションに追加する:addShape(shape)メソッド、および現在保存されている図形の数を返す:count()メソッドを含めてください。main.lua: モジュールを require して、すべてをまとめます。入力から寸法を読み取り、Rectangle と Circle を作成し、両方を ShapeCollection に追加します。その後、コレクションのカウントを出力し、続いて各図形の名前を(追加された順に)出力します。
ShapeCollection は、長方形を保存しているのか円を保存しているのかを知る必要はありません。ただ図形を保持するだけです。これは、ポリモーフィズム(多態性)によって、共通のインターフェースを通じて異なるオブジェクト型を一様に扱う方法を示しています。
入力: 3行 — 幅(数値)、高さ(数値)、および半径(数値)。
出力: 3行 — コレクション内の図形の数、次に追加された最初の図形の名前、次に追加された2番目の図形の名前。
自分で試してみよう
-- Rectangleモジュールを読み込む
local Rectangle = require('Rectangle')
-- Circleモジュールを読み込む
local Circle = require('Circle')
-- ShapeCollectionモジュールを読み込む
local ShapeCollection = require('ShapeCollection')
-- 入力から幅と高さを読み込む
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())
-- 指定された寸法で新しいRectangleインスタンスを作成する
local rect = Rectangle:new(width, height)
-- 指定された半径で新しいCircleインスタンスを作成する
local circ = Circle:new(radius)
-- 新しいShapeCollectionを作成する
local collection = ShapeCollection:new()
-- 両方の図形をコレクションに追加する
collection:addShape(rect)
collection:addShape(circ)
-- コレクション内の図形の数を出力する
print(collection:count())
-- 追加された順に各図形の名前を出力する
for i = 1, collection:count() do
print(collection.shapes[i]:getName())
end