すでに定義しているクラスにメソッドを後から追加することも可能です。まず下のようなクラスとメソッドがあったとします。
1 2 3 4 5 |
class HelloRuby def hello puts "こんにちは" end end |
このクラス定義ではメソッドから文字列「”こんにちは”」しか出力されませんが、新しく「”ありがとう”」と出力させるメソッドを作ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class HelloRuby def hello puts "こんにちは" end end class HelloRuby def thanks puts "ありがとう" end end aisatu = HelloRuby.new aisatu.hello aisatu.thanks |
このように記述を行えば「HelloRubyクラス」に新しく「thanksメソッド」が追加されます。
Contents
クラスの継承
ではこの「HelloRubyクラス」の処理を別のクラスに継承してみましょう。クラスの継承はもとのクラス自体には変更を加えないので、もとのクラスの処理はそのままで部分的に新しい処理を追加したりするのに便利です。
クラスを継承する際の記述方法は下記のようになります。
1 2 3 |
class サブクラス < スーパークラス クラスの内容 end |
なお、継承する前のクラスを「スーパークラス、親クラス」とよび、継承したあとのクラスを「サブクラス、子クラス」と呼びます。
それでは、「HelloRuby」クラスを継承するように記述を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class HelloRuby def hello puts "こんにちは" end end class HelloPuls < HelloRuby def evening puts "こんばんは" end end HelloPuls.new.hello HelloPuls.new.evening |
こんにちは こんばんは
これで「HelloPulsクラス」へと継承ができます。このように記述を行えば「HelloRuby」クラスの「hello」メソッドを引き継いだまま、「HelloPuls」クラスとして「evening」メソッドも作ることができました。
メソッド名の変更と削除
クラス継承の際などにメソッド名を変更したい場合や、メソッド自体の削除を行いたい場合には「alias」や「undef」を使います。
- alias⇒メソッド名に別名を持たせる
- undef⇒メソッドの削除
alias
それでは「alias」を使ってメソッド名別の名前をつけてみましょう。記述方法はメソッド名をそのまま使う方法と、シンボルを使った場合の2通りがあります。
1 2 |
alias 変更後(別名)のメソッド名 変更前のメソッド名 alias :変更後(別名) :変更前 |
これでメソッド名に別名が与えられので「HelloPulsクラス」でのsayHelloメソッドを呼び出せば「”こんにちは”」がputsされることとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class HelloRuby def hello puts "こんにちは" end end class HelloPuls < HelloRuby alias :sayHello :hello def hello puts "hello" end end HelloPuls.new.sayHello HelloPuls.new.hello |
こんにちは hello
また、別名がついているので「helloメソッド」を上書き(オーバーライド)してもとくに問題は発生しません。
undef
次はundefを使ってメソッドの削除をしてみましょう。記述方法は先程のaliasと同じようにメソッド名をそのまま記述した場合とシンボルを使った場合の2通りがあります。
1 2 |
undef メソッド名 undef :メソッド名 |
今回は先程と同様にシンボルを使ってメソッドを削除してみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
class HelloRuby def hello puts "こんにちは" end end class HelloPuls < HelloRuby undef :hello end HelloPuls.new.hello |
このように記述すれば「HelloPuls」のインスタンスから「hello」と呼び出すことはできなくなり、結果的に下のようなエラーが表示されることになります。
C:\Users>class_inheritance.rb C:/Users/class_inheritance.rb:40:in <main>': undefined method hello' for #<HelloPuls:0x00000000a83860> (NoMethodError)
コメントを残す