
Rubyの継承方法について紹介します|superclassメソッドを使いこなそう
- ‘SE’
- ‘Rubyの継承はどんなメリットがあるのですか。’
- ‘PM’
- ‘似たような処理を行うクラスや使用頻度の高いクラスなど共通部分のあるクラスを継承すると、コードが整理されて読みやすくなるというメリットがあります。’
目次
Rubyの継承とは?
今回は、Rubyの継承について説明します。
Rubyでは、定義済みのクラスを継承して新しいクラスを作成できます。継承元のクラスをスーパークラス(親クラス)、継承して作成したクラスをサブクラスといいます。
似たような処理を行うクラスや使用頻度の高いクラスなど、共通部分のあるクラスを利用するために継承します。継承することで、コードが整理されて読みやすくなります。
Rubyの継承に興味のある方はぜひご覧ください。
継承する方法
Rubyでクラスを継承するには「<」を使用します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class SuperClass def hoge puts ""SuperClass hoge method"" end end # クラスの継承 class SubClass < SuperClass def piyo puts ""SubClsass piyo method"" end end # スーパークラスの作成 superClsass = SuperClass.new superClsass.hoge # サブクラスの作成 subClass = SubClass.new subClass.piyo |
実行結果は以下のようになります。
1 2 |
SuperClass hoge method SubClsass piyo method |
class SubClass < SuperClass とすることで、SuperClassを継承したSubClassとなります。
このように、Rubyでクラスを継承するには「<」を使用します。
オーバーライドとは
オーバーライドとは、スーパークラスで定義されているメソッドを、サブクラスで同じ名前で定義することを言います。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class SuperClass def hoge puts ""SuperClass hoge method"" end end # クラスの継承 class SubClass < SuperClass # オーバーライド def hoge puts ""SubClass hoge method"" end def piyo puts ""SubClsass piyo method"" end end superClsass = SuperClass.new superClsass.hoge subClass = SubClass.new subClass.hoge |
実行結果は以下のようになります。
1 2 |
SuperClass hoge method SubClass hoge method |
hogeメソッドがオーバーライドされていることが分かります。
このように、オーバーライドを使うことで、スーパークラスで定義されているメソッドをサブクラス側で自由に書き換えて使用することができます。
スーパークラスのメソッドを呼ぶ方法
オーバーライドされたサブクラス側のメソッドから、スーパークラス側のメソッドを呼び出すこともできます。その際、superメソッドを使用します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class SuperClass def hoge puts ""SuperClass hoge method"" end end # クラスの継承 class SubClass < SuperClass # オーバーライド def hoge super puts ""SubClass hoge method"" end def piyo puts ""SubClsass piyo method"" end end subClass = SubClass.new subClass.hoge |
実行結果は以下のようになります。
1 2 |
SuperClass hoge method SubClass hoge method |
このように、superメソッドでスーパークラス側のメソッドを呼び出すこともできます。
initializeのオーバーライド
Rubyでは、コンストラクタであるinitializeメソッドもオーバーライドできます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
class Person attr_accessor :name,:age def initialize(name,age) @name = name @age = age end def hoge puts ""Person hoge method"" end end # クラスの継承 class Student < Person attr_accessor :student_no # オーバーライド def initialize(name,age,student_no) super(name,age) @student_no = student_no end def hoge puts ""Student hoge method"" end def piyo puts ""Student piyo method"" end end taro = Person.new(""taro"", 30) p taro.name p taro.age hanako = Student.new(""hanako"", 20, 123456) p hanako.name p hanako.age p hanako.student_no |
実行結果は以下のようになります。
1 2 3 4 5 |
""taro"" 30 ""hanako"" 20 123456 |
オーバーライドしたinitializeメソッドで、superメソッドに引数付きで呼び出しています。
このようにRubyでは、コンストラクタであるinitializeメソッドもオーバーライドできます。
superclassメソッド
Rubyのclassメソッドとして、superclassメソッドがあります。
superclassメソッドは、そのクラスのスーパークラス名を返却します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class SuperClass def hoge puts ""SuperClass hoge method"" end end # クラスの継承 class SubClass < SuperClass # オーバーライド def hoge super puts ""SubClass hoge method"" end def piyo puts ""SubClsass piyo method"" end end puts SuperClass.superclass puts SubClass.superclass |
実行結果は以下のようになります。
1 2 |
Object SuperClass |
すべてのクラスはObjectクラスを継承していることが分かります。
is_a?メソッド
Rubyのインスタンスメソッドとして、is_a?メソッドがあります。
is_a?メソッドは、オブジェクトが指定されているクラスのインスタンスか、そのサブクラスのインスタンスである場合にtrueを返却します。
また、オブジェクトがモジュールをインクルードしたクラスか、そのサブクラスのインスタンスであった場合にもtrueを返却します。(このケースは今回説明しません)
上記以外の場合にfalseを返却します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
class SuperClass def hoge(arg=0) puts arg end end # クラスの継承 class SubClass < SuperClass # オーバーライド def hoge(arg) super() # 引数なしで呼び出す end def piyo puts ""SubClsass piyo method"" end end class OtherClass end subClass = SubClass.new puts subClass.is_a?(SubClass) # true puts subClass.is_a?(SuperClass) # true puts subClass.is_a?(Object) # true puts subClass.is_a?(OtherClass) # false |
実行結果は以下のようになります。
1 2 3 4 |
true true true false |
SubClassはSuperClassを継承しており、SuperClassはObjectを継承しています。
そのため、puts subClass.is_a?(OtherClass)だけがfalseになります。
同じことを確認できるメソッドとして、kind_of?メソッドがあります。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
class SuperClass def hoge(arg=0) puts arg end end # クラスの継承 class SubClass < SuperClass # オーバーライド def hoge(arg) super() # 引数なしで呼び出す end def piyo puts ""SubClsass piyo method"" end end class OtherClass end subClass = SubClass.new puts subClass.kind_of?(SubClass) # true puts subClass.kind_of?(SuperClass) # true puts subClass.kind_of?(Object) # true puts subClass.kind_of?(OtherClass) # false |
実行結果は以下のようになります。
1 2 3 4 |
true true true false |
- ‘SE’
- ‘確かに継承することでコードが整理されて読みやすくなっていますね。’
- ‘PM’
- ‘ソースコードを参考にして、ご自身でも書いてみてください。’
Rubyの継承を正しく理解して使いこなそう
いかがでしたでしょうか。
Rubyでは、定義済みのクラスを継承して新しいクラスを作成できます。
継承元のクラスをスーパークラス(親クラス)、継承して作成したクラスをサブクラスといいます。
ぜひご自身でRubyのソースコードを書いて、理解を深めてください。