【Ruby】クラスの拡張と継承

ABOUTこの記事をかいた人

気になること&知らないことをひたすらググることを得意としています。このブログでは最近気になったことを中心に記事を書いていきます。記事には間違った情報を書かないように細心の注意を払っていますが、もし誤りがあった場合はコメントやお問い合わせフォームからご指摘いただければ幸いです。

すでに定義しているクラスにメソッドを後から追加することも可能です。まず下のようなクラスとメソッドがあったとします。

このクラス定義ではメソッドから文字列「”こんにちは”」しか出力されませんが、新しく「”ありがとう”」と出力させるメソッドを作ってみます。

このように記述を行えば「HelloRubyクラス」に新しく「thanksメソッド」が追加されます。

クラスの継承

ではこの「HelloRubyクラス」の処理を別のクラスに継承してみましょう。クラスの継承はもとのクラス自体には変更を加えないので、もとのクラスの処理はそのままで部分的に新しい処理を追加したりするのに便利です。

クラスを継承する際の記述方法は下記のようになります。

なお、継承する前のクラスを「スーパークラス、親クラス」とよび、継承したあとのクラスを「サブクラス、子クラス」と呼びます。

それでは、「HelloRuby」クラスを継承するように記述を行ってみましょう。

こんにちは
こんばんは

これで「HelloPulsクラス」へと継承ができます。このように記述を行えば「HelloRuby」クラスの「hello」メソッドを引き継いだまま、「HelloPuls」クラスとして「evening」メソッドも作ることができました。

メソッド名の変更と削除

クラス継承の際などにメソッド名を変更したい場合や、メソッド自体の削除を行いたい場合には「alias」や「undef」を使います。

  • alias⇒メソッド名に別名を持たせる
  • undef⇒メソッドの削除

alias

それでは「alias」を使ってメソッド名別の名前をつけてみましょう。記述方法はメソッド名をそのまま使う方法と、シンボルを使った場合の2通りがあります。

これでメソッド名に別名が与えられので「HelloPulsクラス」でのsayHelloメソッドを呼び出せば「”こんにちは”」がputsされることとなります。

こんにちは
hello

また、別名がついているので「helloメソッド」を上書き(オーバーライド)してもとくに問題は発生しません。

undef

次はundefを使ってメソッドの削除をしてみましょう。記述方法は先程のaliasと同じようにメソッド名をそのまま記述した場合とシンボルを使った場合の2通りがあります。

今回は先程と同様にシンボルを使ってメソッドを削除してみましょう。

このように記述すれば「HelloPuls」のインスタンスから「hello」と呼び出すことはできなくなり、結果的に下のようなエラーが表示されることになります。

C:\Users>class_inheritance.rb
C:/Users/class_inheritance.rb:40:in <main>': undefined method hello' for #<HelloPuls:0x00000000a83860> (NoMethodError)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

気になること&知らないことをひたすらググることを得意としています。このブログでは最近気になったことを中心に記事を書いていきます。記事には間違った情報を書かないように細心の注意を払っていますが、もし誤りがあった場合はコメントやお問い合わせフォームからご指摘いただければ幸いです。