はじめに
「プロを目指す人のためのRuby入門」の7.6、クラスの継承について、丁寧に学習したいと思ったので、自分の学習メモとしてアウトプットしていきたいと思います。
クラスの継承に関する用語
スーパークラス
継承する方(継承元)
サブクラス
継承される方(継承先)
継承は「スーパークラスの機能を全部引き継ぐための仕組み」という考えは適切ではない。
機能ではなく性質や概念が共通しているかで判断する。
「サブクラス is a スーパークラス」が成り立つかどうかで判断すると良い◎
Ruby標準ライブラリの継承関係
Rubyの継承は単一継承
継承できるスーパークラスは1つだけ。(ただし、Rubyのミックスインという機能は多重継承に似た機能をもつ)
標準ライブラリの継承関係
Rubyの標準ライブラリの代表的なクラスは次の図のような関係になっている。
オブジェクトのクラスを調べる方法
classメソッドやinstance_of?メソッドを使用するとオブジェクトのクラスを調べることができる。
# Userクラスを作成
class User
end
# 独自で作成したクラスはデフォルトでObjectクラスを継承する。
# Userクラスへはメソッドを定義していないが、Objectクラスを継承しているためto_sメソッドなどが使えるようになる。
# classメソッドを使うとクラスを調べることができる
user = User.new
user.class #=> User
user = User.new
user.instance_of?(User) #=>true
# userはUserクラスのインスタンスか?
継承関係を含めて確認したい場合はis_a?メソッドを使う。(「サブクラス is a スーパークラス」が成り立つかどうかの確認だね!)
user = User.new
# is-a関係にあればtrueになる。
user.is_a(User) #=>true
user.is_a(Object) #=>true
user.is_a(BasicObject) #=>true
# is-a関係にない場合はfalse
user.is_a(String) #=>false
クラスの継承
Objectクラス以外を継承したいときは
class サブクラス < スーパークラス
end
スーパークラスのinitializeメソッドを呼び出すときはsuperが使える
class サブクラス < スーパークラス
:
def initialize(a, b, c) # aとbはスーパークラスのinitializeメソッドで代入済み
super(a, b) # superを使うとスーパークラスの同名メソッドを呼び出せる
@c = c
end
:
end
スーパークラスとサブクラスで実行する処理が変わらなければサブクラスで同名メソッドを定義したりsuperを読んだりする必要もない。
メソッドのオーバーライド
サブクラスではスーパークラスと同名のメソッドを定義することでスーパークラスのメソッドをオーバーライド(上書き)できる。
例えば、Objectクラスで定義されているto_sメソッドをサブクラスで再定義(オーバーライド)することで、自分の使いやすい形で表示できるようになる。
まとめ
今回はここまで!
なんとなくの理解にしてしまっていたオブジェクト指向についてしっかり学習したいと思ったのため、「プロを目指す人のためのRuby入門」のクラスの章について、アウトプットしてみました。
参考
書籍:プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで