クラスの継承について
Rubyでは、クラスの継承を行うことができます。
クラスの継承を行えば、あるクラスで定義されているメソッドを別のクラスでも改めて定義することなく使うことができるようになります。
クラスの継承について調べてみたので自分なりにまとめてみました。
クラスの継承とは
クラスの継承とは、すでに作成されたクラスを元に、新しいクラスを作成することです。
継承する側のクラスをサブクラス(子クラス)、継承される側をスーパークラス(親クラス)と言います。
クラスの継承を行うことで、親クラスで定義されているメソッドを子クラスで、改めて定義することなく使うことができます。
rubyに関しては、継承できるクラスは1つと決まっています(単一継承)。
rubyの標準ライブラリでも継承が行われています。代表的な標準ライブラリの継承関係は以下の図のようになっています。
出典:プロになるためのruby入門
クラスの継承を行う方法
自分で作詞したクラスでクラスの継承を行うには、”class 子クラス < 親クラス” とかきます。
以下はFoodクラスがProductクラスを継承してクラスを作成し、子クラスのインスタンスを生成・メソッドを実行した例です。
このように、クラスの継承ではクラスを1から作成することなく、共通の処理を引き継いでクラスを作成することができます。
class Product
def initialize(name, price)
@name = name
@price = price
end
def output_name
puts "商品名:#{@name}"
end
end
class Food < Product
def output_price
puts "価格:#{@price}円"
end
end
chocolate = Food.new("チョコ", 100)
chocolate.output_name
chocolate.output_price
=> 商品名:チョコ
=> 価格:100円
メソッドの上書き
子クラスでは、親クラスに定義されているメソッドと同じ名前のメソッドを定義することで、親クラスのメソッドを上書きすることができます。
下記は、先ほどと同じクラスですが、ProductクラスのメソッドをFoodクラスで上書きしています。すると、上書きしたメソッドの内容が反映されるようになります。
class Product
def initialize(name, price)
@name = name
@price = price
end
def output_name
puts "商品名:#{@name}"
end
end
class Food < Product
def output_price
puts "価格:#{@price}円"
end
def output_name
puts "食べ物の名前:#{@name}"
end
end
chocolate = Food.new("チョコ", 100)
chocolate.output_name
chocolate.output_price
=> 食べ物の名前:チョコ
=> 価格:100円
メソッドの公開レベル
rubyには、public、protected、private と言う3つの公開レベルが存在します。
・publicメソッド
クラスの外からでも中からでも呼び出せるメソッドです。
・protected
メソッドを定義したクラス自身と、その子クラスのインスタンスメソッドからレシーバ付きで呼び出せます。
・private
メソッドを定義したクラス自身とその子クラスで呼び出すことができます。しかしレシーバーを指定することはできません。