クラスの継承とメッセージ
クラスとは、状態とその状態を使用する手続きを1つにしたものです。
基本クラス Song から作成してみましょう。このクラスには1つのメソッド initialize を定義します。
class Song | ||
def initialize (name, artist, duration) | ||
@name = name @artist = artist @duration = duration |
||
end | ||
end |
initialize は特殊なメソッドです。Song.new を呼び出して新しい Song オブジェクトを作成すると、Rubyは、初期化されていないオブジェクトを格納するためのメモリを割り当ててから、そのオブジェクトの initialize メソッドを呼び出します。その際、new に渡されたすべての引数を渡します。
各オブジェクトはその曲自身を表すため、Songオブジェクトはそれぞれ、自分の曲名・アーティスト・演奏時間の3つを持ち歩く必要があります。つまり、これらの値はインスタンス変数としてオブジェクト内に格納する必要があります。
Rubyでは、クラス定義は固定されず、動的に変更可能なので、既存のクラスにいつでもメソッドを追加できます。例えば、メッセージを自分の設計とおりに出力したい場合、 to_s メソッドを追加します。(ここで追加定義がない場合、Object クラス(先祖オブジェクト)に定義されているインスタンスメソッドの to_s を使用することになります。)
class Song | ||
def to_s | ||
“演奏曲: #@name — #@artist (#@duration)” | ||
end | ||
end | ||
song = Song.new(”さくら”, “桃太郎”, 120) | ||
song.to_s → “演奏曲: さくら — 桃太郎 (120)” |
今度新しいクラス KaraokeSong を定義し、歌詞を表示できるようにします。
class KaraokeSong < Song | ||
def initialize(name, artist, duration, lyrics) | ||
super(name, artist, duration) @lyrics = lyrics |
||
end | ||
# 歌詞を親オブジェクトの #to_s の値に追加することで、 # 自身を文字列としてフォーマットする |
||
def to_s | ||
super + ” [#@lyrics]” | ||
end | ||
end | ||
song = KaraokeSong.new(”さくら”, “桃太郎”, 120, “さくら さくら・・・”) | ||
song.to_s → “演奏曲: さくら — 桃太郎 (120) [さくら さくら・・・]” |
クラス定義の < Song の部分は、KaraokeSong が Song のサブクラスであることを示します。(Song は KaraokeSong のスーパークラスになります)
クラスを定義するときスーパークラスを指定しないと、Object クラスが暗黙に指定されます。つまり、すべてのオブジェクトは Object を先祖に持ち、 Object のインスタンスメソッドは、Ruby のすべてのオブジェクトで使用できるということです。
コメント