【Ruby入門】クラスの継承のやり方まとめ

継承を用いることで、コードのメンテナンスや拡張がしやすくなります。

ここでは Ruby でクラスの継承を行うやり方を解説していきます。

メモ

そもそも継承とは何か? という話についてはこちら

 

継承の基本

Ruby でクラスの継承を行うには、以下のようにクラスを定義するときに、継承するクラス名を指定します。

class クラス名 < 継承するクラス名

end

 

プログラム例

以下は「User」クラスを継承して、「Japanese」クラスを作成した例。

プログラム
class User
  def hello
    p "Hello"
  end
end

class Japanese < User
  def morning
    p "おはよう"
  end
end

japanese = Japanese.new
japanese.morning
japanese.hello
実行結果
"おはよう"
"Hello"

class Japanese < User の行で「Japanese」クラスは「User」クラスを継承しています。

そのため japanese.morning で「Japanese」クラスで定義した「morning」メソッドを呼び出せるだけでなく、japanese.hello で「User」クラスで定義した「hello」メソッドも呼び出せることが確認できます。

 

スーパークラスのメソッドを上書き(オーバーライド)する

サブクラス内では、スーパークラス内にあるものと同じ名前でメソッドを作成すると、そのメソッドの処理を上書き(オーバーライド)することができます。

 

プログラム例

以下はスーパークラスの「hello」メソッドを、サブクラスで上書き(オーバーライド)した例。

プログラム
class User
  def hello
    p "Hello"
  end
end

class Japanese < User
  def hello
    p "こんにちは"
  end
end

japanese = Japanese.new
japanese.hello
実行結果
"こんにちは"

「Japanese」クラス内では、「User」クラス内の「hello」メソッドと同じ名前でメソッドを作成しています。

そのため、japanese.hello で「hello」メソッドを呼び出すと、サブクラス内の「hello」メソッドが優先して呼び出されるため、実行結果では「Hello」ではなく「こんにちは」と表示されることが確認できます。

 

スーパークラスのメソッドの処理を呼び出す(super の使い方)

サブクラスのメソッド内で super を使うと、スーパークラスの同じ名前のメソッドの処理を呼び出すことができます。

 

プログラム例

以下は、サブクラスである「Japanese」でスーパークラスである「User」のメソッドの処理を呼び出す例。

プログラム
class User
  def hello
    p "Hello"
  end
end

class Japanese < User
  def hello
    p "こんにちは"
    super
  end
end

japanese = Japanese.new
japanese.hello
実行結果
"こんにちは"
"Hello"

「Japanese」クラスの「hello」メソッド内で super を呼び出すと、スーパークラスである「User」の同じ名前のメソッドの処理が呼び出されます。

そのため実行結果では、「こんにちは」だけでなく「Hello」も表示されることが確認できます。

 

スーパークラスを確認する(superclass の使い方)

superclass を使うと、そのクラスのスーパークラスを確認することができます。

 

プログラム例

以下は「Japanese」クラスのスーパークラスを確認する例。

プログラム
class User

end

class Japanese < User

end

p Japanese.superclass
実行結果
User

p Japanese.superclass を実行すると、「Japanese」クラスのスーパークラスである「User」が表示されることが確認できます。

 

まとめ

以上、Ruby でクラスの継承を行うやり方でした!

 

ここまでの内容をまとめておきます。

  • class クラス名 < 継承するクラス名 〜 end のようにして、クラスを定義するときに継承するクラス名を指定できる。
  • サブクラス内では、スーパークラス内にあるものと同じ名前でメソッドを作成すると、そのメソッドの処理を上書き(オーバーライド)することができる。
  • サブクラスのメソッド内で super を使うと、スーパークラスの同じ名前のメソッドの処理を呼び出すことができる。
  • superclass を使うと、そのクラスのスーパークラスを確認することができる。