長方形クラス(面積と周長)
長方形の幅と高さから、面積と周長を出します。計算そのものは掛け算と足し算だけです。難しくなるのは、長方形が 1 つではなくなったときです。
幅と高さが 3 組あると、変数が 6 個になる
Python
width1, height1 = 5, 3
width2, height2 = 10, 4
width3, height3 = 7, 7
area2 = width2 * height2area2 を出すとき、width2 と height2 が正しく組になっているかは、変数名を目で確かめるしかありません。width2 * height3 と書いてもエラーは出ず、間違った数字が静かに返ってきます。幅と高さは「たまたま近くに置いた 2 つの変数」ではなく、本来 1 つのものの一部です。
設計図を 1 枚書いて、そこから作る
クラス は、持っている値と、その値を使う操作を、1 枚の設計図にまとめる仕組みです。楽曲の再生時間を扱うなら、こう書きます。
Python
class Track:
def __init__(self, minutes, seconds):
self.minutes = minutes
self.seconds = seconds
def total_seconds(self):
return self.minutes * 60 + self.seconds__init__ は、設計図から実物を 1 個作るときに一度だけ呼ばれます。self は「いま作られている、この 1 個」を指す名前です。self.minutes と書くことで、その 1 個が持つ値として残ります。
Track(3, 45) と書けば実物が 1 個できあがり、total_seconds() は 225 を返します。分と秒がばらけないので、片方だけ別の曲の値を渡す事故が起きません。
同じ設計図から作っても、中身は別々
JavaScript
class Track {
constructor(minutes, seconds) {
this.minutes = minutes;
this.seconds = seconds;
}
totalSeconds() {
return this.minutes * 60 + this.seconds;
}
}
const opening = new Track(1, 30);
const ending = new Track(4, 12);opening と ending は同じ設計図から作られていますが、値は完全に別々に持ちます。JavaScript では self の代わりに this を使います。設計図が クラス、そこから作られた 1 個が インスタンス、インスタンスが持つ値が 属性、操作が メソッド です。
オブジェクト指向の柱は、外から触れる範囲を絞る カプセル化、共通部分を親にまとめる 継承、同じ呼び方で違う動きをさせる ポリモーフィズム の 3 つです。この章では、必要になった回に 1 つずつ出していきます。
やってみよう
rectInfo(width, height) を書いてください。中で長方形を表すクラスを 1 つ定義し、面積と周長をそれぞれメソッドとして持たせます。返すのはインスタンスではなく [面積, 周長] の配列です。テストはインスタンスの中身を直接比べられないので、最後は必ず単純な値に戻して返してください。
要件
- 関数
rectInfo(width, height)を実装し、[面積, 周長]の配列を返す - 内部で
Rectangleクラス (または同等の構造体) を定義し、area/perimeter相当の操作を持たせる - 面積は
width * height、周長は2 * (width + height)で計算する
入出力例
rectInfo(5, 3) → [15,16]
rectInfo(1, 1) → [1,4]
rectInfo(10, 4) → [40,28]
rectInfo(7, 7) → [49,28]
rectInfo(2, 100) → [200,204]