【Ruby入門】クラスの継承まとめ

こんにちは! フリーエンジニアの長瀬です。

クラスの継承ってなんだか難しそうだなって思っていませんか?

クラスの継承をマスターすれば、無駄に多くなりがちなクラスを整理することができます。

この記事では、クラスの継承について

・継承の方法
・継承の確認
・継承した時のinitialize

という基本的な内容から、

・メソッドのオーバーライド
・親クラスのメソッドを呼び出す
・複数の継承

といった応用的な内容についても解説していきます。

目次

継承の方法

それではまず継承の方法について解説していきます。

Rubyの継承は「<」を使うことで行うことができます。

今回はAnimalクラスをDogクラスに継承してみましょう。

class Animal
  def name
    "animal"
  end
end

class Dog < Animal
end

dog = Dog.new
p dog.name

継承が成功し、DogクラスでもAnimalクラスのnameメソッドが使えていることがわかります。

このようにRubyでは「<」を使用することで簡単に継承を行うことができます。

一つ注意点があり、Rubyは継承を1クラスしか行うことができません。

そのため、複数の継承のように実装しようと思うと、後に説明するMixinという機能を使う必要があります。

継承の確認

次に継承を確認する方法について解説していきます。

継承は不等号を使用することで確認することができます。

class Animal
  def name
    "animal"
  end
end

class Dog < Animal
end

p Dog > Animal #=> false
p Dog < Animal #=> true

継承されていればtrue、されていなければfalseを返します。

このようにRubyでは直感的に継承の確認を行うことができます。

継承した時のinitialize

継承した際に気になるのがinitializeの扱いです。

initializeがわからない方はこちらを参考にしてください。

これは二つのパターンによって処理が異なります。

まずは、子クラスにinitializeメソッドが定義されていない場合です。
この場合、親クラスのinitializeメソッドが呼ばれます。

class Animal
  def initialize
    p "animal"
  end
end

class Dog < Animal
end

Animal.new #=> animal
Dog.new #=> animal

次に子クラスにinitializeメソッドが定義されている場合です。

この場合、子クラスのinitializeメソッドが呼び出されます。

class Animal
  def initialize
    p "animal"
  end
end

class Dog < Animal
  def initialize
    p "dog"
  end
end

Animal.new #=> animal
Dog.new #=> dog

メソッドのオーバーライド(上書き)

initializeのときと同じで、メソッドも親クラスと同じメソッドが子クラスで定義されている場合は子クラスのメソッドが呼び出されます。

まず、クラスメソッドの扱い方がわからない方は以下の記事を参考にしてください。

class Animal
  def bark
    p "ヌーン"
  end
end

class Dog < Animal
  def sit
    p "おすわり"
  end
end

class Cat < Animal
  def bark
    p "ニャン!"
  end
end

dog = Dog.new
dog.bark#=>"ヌーン"

cat = Cat.new
cat.bark#=>"ニャン!"

親クラスのメソッドを呼び出す

親メソッドはsuperを子クラスの同じ名前のメソッド内で使用することで呼び出すことができます。

さきほどのサンプルコードから、Dogクラス削除して、Catクラスのbarkメソッドにsuperを加えてみましょう。

class Animal
  def bark
    p "ヌーン!"
  end
end

class Cat < Animal
  def bark
    super
    p "ニャン!"
  end
end

cat = Cat.new
cat.bark
#=>
#"ヌーン!"
#"ニャン!"



複数の継承

Rubyでは複数の継承を行うことはできません。

そのため、モジュールという仕組みを利用して、複数継承しているように見せる実装を行います。
モジュールに関しては以下の記事をご参考にください!


【Ruby入門】includeの使い方とrequireとの違いについて解説!
更新日:2024年5月6日

まとめ

この記事では、クラスの継承を解説しました。

継承という概念は、難しく感じますが実際に書いてみると単純なものだということがわかります。

継承すれば、親クラスで定義されているメソッドを使えるようになるので、あるカテゴリー(今回の場合はAnimal)の共通要素を親クラスに定義して継承させれば、同じメソッドを何度も定義する必要がなくなり効率的です。

もしクラスの継承について忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次