Menu
Coddy logo textTech

合計面積

CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 60/70。

challenge icon

チャレンジ

簡単

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())

Object Oriented Programmingのすべてのレッスン