LoginSignup
0
0

More than 3 years have passed since last update.

【Ruby】「プロを目指す人のためのRuby入門」アウトプット (クラスの継承)

Posted at

はじめに

「プロを目指す人のためのRuby入門」の7.6、クラスの継承について、丁寧に学習したいと思ったので、自分の学習メモとしてアウトプットしていきたいと思います。

クラスの継承に関する用語

スーパークラス

継承する方(継承元)

サブクラス

継承される方(継承先)

継承は「スーパークラスの機能を全部引き継ぐための仕組み」という考えは適切ではない。
機能ではなく性質や概念が共通しているかで判断する。
「サブクラス is a スーパークラス」が成り立つかどうかで判断すると良い◎

Ruby標準ライブラリの継承関係

Rubyの継承は単一継承

継承できるスーパークラスは1つだけ。(ただし、Rubyのミックスインという機能は多重継承に似た機能をもつ)

標準ライブラリの継承関係

Rubyの標準ライブラリの代表的なクラスは次の図のような関係になっている。

image.png
出典:プロを目指す人のための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入門 言語仕様からテスト駆動開発・デバッグ技法まで

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0