JavaからのRuby on Rails入門

Rubyの継承とオーバーライドについてまとめてみた

calendar

reload

スポンサーリンク

継承する方法

 Rubyの継承は、「<」を使用する。

 プログラマーも人間なので、ご飯を食べることが出来る。

オーバーライド

 オーバーライドとは、親クラスで定義しているメソッドと同名のメソッドを子クラスで普通に再定義(上書き)すること。

 プログラマーである以上、ご飯は急いで食べなければならない。

親クラスのメソッドを呼ぶ方法

 オーバーライドの定義域内で、superを使うことで、親クラス定義されている同名のメソッドを呼ぶことが出来る。

 何か悩みでもあるのか、プログラマーはぐっすり眠れない。

superに引数を渡す

 superに引数を渡すことも出来るか、ちょっとややこしい。

 まず、superはデフォルトで引数を全部勝手に引き継ぐ。どういうことかと言うと、

 Barクラスのオーバーライド定義域においてsuperで親のメソッドを呼んでいるのだが、受け取った引数をsuperに渡そうが渡すまいが、plus_5メソッドが受け取った3という引数が親メソッドに渡されているのが分かる。

 つまり、superで親クラスのメソッドを呼ぶ際、わざわざ引数を渡さなくてもよい。

 親クラスのplus_5メソッドの引数にデフォルト値を設定してみる。↓

 この状態で、子クラスのplus_5メソッドを引数なしで呼んでみると、

 親クラスのデフォルト値である0が引数として使われているのが分かる。

 ややこしいのは、子クラスで別のデフォルト値を設定した場合。

 この場合、子クラスで設定したデフォルト値10がsuperに渡される。つまり子クラスのデフォルト値が優先される。

 子クラスで設定したデフォルト値をスルーしてsuperを呼ぶ方法もある。superにあえて空の()を付ける。

 super()の方は出力結果が5になっているように、子クラスのデフォルト値が無視されて親クラスのデフォルト値が使われているのが分かる。

 実は、superに空の()を付けて使うと、そもそもplus_5メソッドが受け取った引数を無効化されることになる。

 とりあえず以下のことを頭に入れておくとよいと思う。

  • superはメソッドが受け取った引数(あるいは子クラスで定義したデフォルト値)を自動的に親クラスのメソッドに渡して呼ぶ
  • 純粋に親クラスで定義したメソッドを呼びたい場合はsuper()を使う

superclassメソッド

 全てのクラスは、クラスメソッドとしてsuperclassメソッドを持っている。

 superclassメソッドは、そのクラスの親クラス名を返す。

 プログラマーも人間であることが分かる。

 あくまでクラスメソッドであり、インスタンスに対して使ってもエラーになるだけなので注意。

is_a?メソッド

 上記のsuperclassメソッドはクラスメソッドだが、インスタンスメソッドでis_a?メソッドというのもある。

 is_a?メソッドは引数にクラスオブジェクトを受け取り、レシーバが引数のクラスの子孫にあたるクラスのインスタンスならtrueを返す。

 やはりプログラマーも人間であることが分かる。

分からないことはここで質問してみてください↓

この記事をシェアする

コメント

コメントはありません。

down コメントを残す




関連記事

書いている人

Nobuo

Nobuo

一番かんたんなJava入門というサイトを運営しています。Javaやphpは少し分かりますが、Ruby on Railsについては全く何も知らないので、このサイトにアウトプットしながら覚えていこうかと思っています。 [詳細]

folder Rubyの基本文法

more...

folder 初めてのRuby on Rails入門

more...

folder Rails忘備録

more...