標準的
親クラスのメソッドは子クラスから利用可能で、子クラス独自のメソッド定義が可能。
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 39 40 41 42 43 44 45 46 47 48 49 50 51 |
class Vehicle def activate() puts "始動しました" end def deactivate() puts "機能停止しました" end end class Car < Vehicle def run() puts "走行します" end def stop() puts "停車します" end end class Airplane < Vehicle def fly() puts "飛行します" end def make_landing() puts "着陸します" end end volkswagen = Car.new volkswagen.activate volkswagen.run volkswagen.stop volkswagen.deactivate # 始動しました # 走行します # 停車します # 機能停止しました a300 = Airplane.new a300.activate a300.fly a300.make_landing a300.deactivate # 始動しました # 飛行します # 着陸します # 機能停止しました |
親クラスのメソッドの、子クラスでのオーバーライドも普通。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class MobileBanking def authenticate() puts "パスワード認証" end end class SaferBanking < MobileBanking def authenticate() puts "生体認証->認証番号確認" end end bank_system = MobileBanking.new bank_system.authenticate # パスワード認証 safer_system = SaferBanking.new safer_system.authenticate # 生体認証->認証番号確認 |
super
親クラスのメソッドの呼び出し
メソッドをオーバーライドするとき、super
を使うと親クラスの同じ名前のメソッドを呼び出せる。
以下の例では、子クラスのメソッドが親クラスのメソッドをオーバーライドしつつ、その中で親クラスのメソッドをsuper
で呼び出している。その結果、まず親クラスのメソッドが実行され、次に子クラスのメソッドで定義された処理が実行されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class MobileBanking def authenticate() puts "パスワード認証" end end class SaferBanking < MobileBanking def authenticate() super puts "第二暗唱番号認証" end end safer_system = SaferBanking.new safer_system.authenticate # パスワード認証 # 第二暗唱番号認証 |
initialize内でのsuper
initialize()
でもsuper
を使える。以下の例での流れは次の通り。
- 子クラス
Bird
インスタンスbird
の生成時、Birdのコンストラクターが実行される Bird
のコンストラクターはsuper
で親クラスCreature
のコンストラクターを呼び出して実行し、親クラスのプロパティー@num_legs
に2をセット- その後子クラス
Bird
のコンストラクターで子クラスのプロパティー@num_wings
に2をセット bird.form()
は子クラスのform()
メソッドを呼び出しBird
のform()
メソッドはsuper
で親クラスCreature
のform()
メソッドを呼び出し、@num_legs
を表示- その後
Bird
のform()
メソッドで@num_wings
を表示
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 |
class Creature def initialize(num_legs) @num_legs = num_legs end def form() puts "#{@num_legs} legs" end end class Bird < Creature def initialize() super(2) @num_wings = 2 end def form() super puts "#{@num_wings} wings" end end bird = Bird.new bird.form # 2 legs # 2 wings |
public/protected/private
これらの挙動はC++やJavaにおける挙動と一部で異なる。詳しくはこちら。