長方形クラス(面積と周長)
長方形の幅と高さから、面積と周長を出します。計算そのものは掛け算と足し算だけです。難しくなるのは、長方形が 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 つずつ出していきます。
やってみよう
ひな形の TODO を完成させてください。属性の保存と、その属性を使う面積・周長を自分で書きます。入力を受け取る枠と説明つきの準備部分はそのまま使えます。
演習で使う書き方
本文の Track は時間を部品に保存し、メソッドで秒数へ変換します。演習の Rectangle も、作るときに受け取った値を属性として残し、メソッドで使います。self はその部品を指します。クラスと呼び出しの枠は用意したので、属性の保存と二つの計算を書きます。
要件
- 属性の保存と、その属性を使う面積・周長を自分で実装する
- 関数名と引数、入力と戻り値の形を保つ。説明つきの準備部分を使い、TODO の仮の処理を置き換える