クラスの継承について

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

メソッドを定義したクラス自身とその子クラスで呼び出すことができます。しかしレシーバーを指定することはできません。