合計面積
CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 60/70。
チャレンジ
簡単ShapeCollectionに強力な機能を追加しましょう。それは、含まれているすべての図形の合計面積を計算する機能です。ここでポリモーフィズム(多態性)が真価を発揮します。コレクションは、図形が長方形か円かを知らなくても、任意の図形に対して :getArea() を呼び出すことができます。
既存のプロジェクトファイルを基に構築を続けます:
Shape.lua: ベースとなる Shape クラス(変更なし)。Rectangle.lua::getArea()と:getPerimeter()を持つ Rectangle クラス。Circle.lua::getArea()と:getPerimeter()を持つ Circle クラス。ShapeCollection.lua::getTotalArea()メソッドを追加してコレクションクラスを拡張します。このメソッドは、保存されているすべての図形を反復処理し、それぞれに対して:getArea()を呼び出し、すべての面積の合計を返す必要があります。main.lua: モジュールをロードし、入力から寸法を読み取り、Rectangle と Circle を作成して両方を ShapeCollection に追加し、コレクション内のすべての図形の合計面積を出力します。
このアプローチの素晴らしい点は、:getTotalArea() が長方形と円に対して個別のロジックを必要としないことです。コレクション内のすべての図形が :getArea() メソッドを持っていることを単に信頼しています。後で三角形や六角形、あるいは他の図形を追加したとしても、合計面積の計算は修正なしで機能します。
入力: 3行 — 幅(数値)、高さ(数値)、および半径(数値)。
出力: コレクション内のすべての図形の合計面積を含む1行。
自分で試してみよう
-- 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:getTotalArea())