本文へスキップ
BecomeCoder

Rubyコース · 第7章 クラスとオブジェクト指向 · レッスン32

継承とsuper ― 親クラスの機能を引き継ぐ

ブラウザで完結

導入

「犬」も「猫」も「動物」の一種です。共通する部分(名前を持つ、鳴くなど)は「動物」クラスにまとめておき、犬や猫の特有の部分だけを追加で書きたい――そんなときに使うのが継承です。

説明

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 によって、DogAnimalinitializespeak を引き継ぎます。
  • Dogspeak を再定義(オーバーライド)すると、Dogオブジェクトでは Dog 版の speak が呼ばれます。
  • super を呼ぶと、親クラス(Animal)の同名メソッドを呼び出せます。「親の処理をベースに、少しだけ追加したい」ときに便利です。

やってみよう

Dogspeak から super を消してみて、base がどうなるか(エラーになるか)確認しましょう。新しい子クラス Cat < Animal を作って、同じように speak をオーバーライドしてみてください。

演習

Vehicle クラスに initialize(name)info メソッド("#{@name}です" を返す)を定義し、Car < Vehicleinfo をオーバーライドして super の結果に "(車です)" を付け加えて返すようにしてください。Car.new("プリウス").infoputs で表示してください。

ヒント1を見る

Carinfodef info super + "(車です)" end のように書けます。

ヒント2を見る

super は親クラスの info の戻り値(文字列)を返します。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。