合計面積
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 60/70。
チャレンジ
簡単ShapeCollection に強力な機能を追加しましょう。つまり、含まれているすべての図形の合計面積を計算する機能です。ここでポリモーフィズムが本領を発揮します。コレクションは、それが長方形なのか円なのかを知らなくても、任意の図形に対して :getArea() を呼び出せます。
既存のプロジェクトファイルを引き続き拡張します。
Shape.lua:基本の Shape クラス(変更なし)。Rectangle.lua::getArea()と:getPerimeter()を備えた Rectangle クラス。Circle.lua::getArea()と:getPerimeter()を備えた Circle クラス。ShapeCollection.lua::getTotalArea()メソッドを追加してコレクションクラスを拡張します。このメソッドは、格納されているすべての図形を反復処理し、それぞれに対して:getArea()を呼び出し、すべての面積の合計を返します。main.lua:モジュールを Require し、入力から寸法を読み取り、Rectangle と Circle を作成し、両方を ShapeCollection に追加してから、コレクション内のすべての図形の合計面積を出力します。
このアプローチの優れた点は、:getTotalArea() が長方形と円それぞれに対する個別のロジックを必要としないことです。コレクション内のすべての図形が :getArea() メソッドを持っていると単純に信頼します。後から三角形、六角形、その他の図形を追加しても、合計面積の計算は変更なしで機能します。
入力: 3 行:width(数値)、height(数値)、radius(数値)。
出力: コレクション内のすべての図形の合計面積を含む 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())
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ