こんにちは! フリーエンジニアの長瀬です。
クラスの継承ってなんだか難しそうだなって思っていませんか?
クラスの継承をマスターすれば、無駄に多くなりがちなクラスを整理することができます。
この記事では、クラスの継承について
・継承の方法
・継承の確認
・継承した時の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では複数の継承を行うことはできません。
そのため、モジュールという仕組みを利用して、複数継承しているように見せる実装を行います。
モジュールに関しては以下の記事をご参考にください!
まとめ
この記事では、クラスの継承を解説しました。
継承という概念は、難しく感じますが実際に書いてみると単純なものだということがわかります。
継承すれば、親クラスで定義されているメソッドを使えるようになるので、あるカテゴリー(今回の場合はAnimal)の共通要素を親クラスに定義して継承させれば、同じメソッドを何度も定義する必要がなくなり効率的です。
もしクラスの継承について忘れてしまったらこの記事を確認してくださいね!