継承を用いることで、コードのメンテナンスや拡張がしやすくなります。
ここでは 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
を使うと、そのクラスのスーパークラスを確認することができる。