【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)の共通要素を親クラスに定義して継承させれば、同じメソッドを何度も定義する必要がなくなり効率的です。

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

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

長瀬来

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

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

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

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

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

趣味は語学、読書です。

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー