クラスの継承について

5日目です。

 

 

今まで学習サイトや書籍で勉強していた中でも「クラスの継承」について理解が難しかったのですが、チェリー本では分かりやすかったので、後で見返した時にも思い出しやすいよう自分なりにまとめました。

 

クラスの継承が適切であるかの基準

「is-aの関係」を見るように説明があります。それは、下記の関係が成立するかによってサブクラスを作るべきかを考えるそうです。

「サブクラスはスーパークラスの一種である」という関係が成り立つか

(サブクラス is a スーパークラス

仮に「Animal」がスーパークラス、「Dog」がサブクラスとすると、

「DogはAnimalの一種である」(Dog is a Animal)が成り立ちます。

「性質や概念が共通しているかどうか」が継承を使う上での基準になるが、その為に上記を基に考えると良いそうです。

下記のサイトも参考になりました。

https://programming-study.com/technology/ruby-make-subclass/

 

クラスの関係性

ちなみに、今まで下記のような図は見る機会がありました。(図①)

                                          Menuクラス(親orスーパークラス

                                                      ⇧

                                          Foodクラス(子orサブクラス)

「継承すると子クラスは親クラスのインスタンス変数とインスタンスメソッドを引き継ぎます」とのこと。

ただ、この図と説明だけでは何のことを言っているのかよく分かりづらかったです。

チェリー本の著者も、「継承はスーパークラスの機能を全部引き継ぐためのしくみと見なされる場合がありますが、そのように考えると非常に扱いづらいクラスが出来上がってしまいます」と説明しています。

 

そもそも、今まで「〇〇クラス」ってたくさん出てきたけど、関係性もいまいちよく分からないな、、と思っていたところでこの図が出てきました。(図②)

image.png

「事実上はObjectクラスが頂点」

Rubyの継承は単一継承で、継承できるスーパークラスは1つだけ」

「StringやArrayのような代表的なクラスは全てObjectクラスを継承している」

クラスの関係について何となく分かった気がします笑

 

上記の補足として、

「自作のクラスはデフォルトでObject クラスを継承していますが、独自のクラスを定義する際はObject クラス以外のクラスを継承することもできます」

という説明があり、(図①)は「標準ライブラリではない自作のクラス同士を継承の関係にしていた」のだと理解できました。

ーーーーーーーーーーーーーー

 

本日はチェリー本第7章7.6「クラスの継承」まで終わりました。

明日はついにTEC::EXPRETの教材が触れるようになるので、今後キックオフの7/13までの期間をどのように進めていくか決めます。(キックオフ後2週間以内に基礎テストを終わらせないといけないみたいなので、事前にできるだけ進めたいです)