【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との違いについて解説!
更新日 : 2018年6月7日

まとめ

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

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

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

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

プログラミング学習を効率良く進めたいなら…

学習を始めたけどエラーが解決できない
作りたいものはあるけど、何から始めればいいかわからない
プログラミングに対して、このような悩みを持っている方も多いですよね。

そんな方には、弊社が運営するサブスク型のプログラミングスクール「SAMURAI ENGINEER Plus+がおすすめです。



月額2980円(税別)で、主に4つのサービスを提供させていただきます。

  • 現役エンジニアによる月1度の「マンツーマン指導」
  • 平均回答時間30分の「Q&Aサービス」
  • 作りながら学べる28種類の「教材」
  • 学習を記録&仲間と共有できる「学習ログ」

目的にあった教材を選べば、どなたでも効率よく学習できるほか、Q&Aサービスやマンツーマン指導を活用することで、挫折せずにプログラミングの習得が可能です。

プログラミングを効率的に学びたい人はもちろん、何から始めたらよいのかわからない方は、ぜひ「SAMURAI ENGINEER Plus+」をご利用ください。
まずは30日無料体験

書いた人

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。