導入
「犬」も「猫」も「動物」の一種です。共通する部分(名前を持つ、鳴くなど)は「動物」クラスにまとめておき、犬や猫の特有の部分だけを追加で書きたい――そんなときに使うのが継承です。
説明
class 子クラス < 親クラス と書くと、子クラスは親クラスのメソッドをすべて引き継ぎます。
class Animal
def initialize(name)
@name = name
end
def speak
"#{@name}は鳴きます"
end
end
class Dog < Animal
def speak
base = super
"#{base}(ワン!)"
end
end
d = Dog.new("ポチ")
puts d.speak
Dog < Animalによって、DogはAnimalのinitializeやspeakを引き継ぎます。Dogでspeakを再定義(オーバーライド)すると、DogのオブジェクトではDog版のspeakが呼ばれます。superを呼ぶと、親クラス(Animal)の同名メソッドを呼び出せます。「親の処理をベースに、少しだけ追加したい」ときに便利です。
やってみよう
Dog の speak から super を消してみて、base がどうなるか(エラーになるか)確認しましょう。新しい子クラス Cat < Animal を作って、同じように speak をオーバーライドしてみてください。
演習
Vehicle クラスに initialize(name) と info メソッド("#{@name}です" を返す)を定義し、Car < Vehicle で info をオーバーライドして super の結果に "(車です)" を付け加えて返すようにしてください。Car.new("プリウス").info を puts で表示してください。
ヒント1を見る
Car の info は def info super + "(車です)" end のように書けます。
ヒント2を見る
super は親クラスの info の戻り値(文字列)を返します。