◆当サイトで人気のプログラミング教室のおすすめランキングはこちら!
プログラミングは独学では非効率で、時間を無駄にするリスクがあります。効率的なカリキュラムで学べるスクールを受講しましょう。

DMM WEBCAMP【マンツーマンサポート】1ヶ月短期集中でプログラミングを学ぶスクール
1ヶ月通い放題・メンター常駐の教室環境でプログラミングを学びたい方!
TechAcademyオンラインで開講しているプログラミングスクール
オンラインでどこでも学べる!/教室に行くのが忙しい人でも安心!
TECH::CAMP教養としてのITスキルを学べるスクール
Webデザイン/AI(人工知能)/IOS/Androidアプリ制作/VRを学びたい方!
DMM WEBCAMP PRO転職保証付き!エンジニアとして転職したい人におすすめ!
未経験からプロのエンジニアへ3ヶ月で転職する為のスクールです!
1月生募集中!当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のDMM WEBCAMP PROコース。
12月生は満員となっております。1月生募集に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

Rubyのクラスを作れるようになると、正直なところプログラムが面白くなってきます。

そのクラスの持つ値の意味と用途を考え、いかに便利で汎用的なメソッドを準備するのか、どこまで制限を加えるのか、すべては作り手であるあなたにかかっています。

しかし、考えた結果、既存のクラスで問題ないことが判明することも、少なくありません。それこそ、オブジェクト指向のメリットである再利用性が働いた瞬間ですが、少しばかり空しいものです。

ただし、そういうときは、往々にして少し機能が不足しています。

そんなときに、既存の機能はそのままに、必要な機能をプラスした新たなクラスを簡単に作ることができます。

それが、「継承」です。

「継承」は、オブジェクト指向の基本となる特徴の1つですが、それだけに他のプログラム作成技法に比べて開発効率を上げる大きなメリットの1つです。

しっかりと理解して、開発効率を上げていきましょう。

※プログラミングを学んでみたいけど、時間がなくて全文の記事が読めない!という方は、WebCampの無料説明会(毎日開催)に参加してみてください!

Rubyのクラス継承とは?

「継承」というのは、オブジェクト指向の基本的な概念の1つです。

そのため、純粋なオブジェクト指向言語であるRubyでは、以下のように容易に継承を実現できるようになっています。

class クラス名 < 継承元のクラス名
end

これだけで、新しいクラスに継承元のクラスのほぼすべての機能を持ったクラスができあがります。

簡単な例を挙げておきましょう。

class Seisu < Numeric
end

kazu = Seisu.new

kazu = 5
5.times {|i| puts(i)}

(結果)

0
1
2
3
4

Seisuクラス自体には、何も定義していませんが、Numeric(数値クラス)を継承していますので、timesメソッドが利用できています。

親子関係

クラスの継承を行うことで、継承元クラスのメソッドを使えるクラスを作ることができます。

そのため、継承元のサイトを親クラス(スーパークラスとも呼びます)、継承して新たにできたクラスのことを子クラスとした親子関係と考えることができます。

なお、他のプログラム言語では複数のクラスを継承する「多重継承」ができるものもありますが、Rubyでは多重継承はできないようになっています。

親は必ず1人、ということです。

多態性(ポリモーフィズム)

カプセル化や継承はオブジェクト指向の特徴ですが、もう1つ、オブジェクト指向の特徴的なものに、多態性(ポリモーフィズム)というものがあります。

これは、同じ名前のメソッドを同じように利用しても、利用するオブジェクト(クラス)によって動作が違う(適した動作を行う)ということです。

具体的に見てみましょう。

inherit00-1.rb

class Grandpa
  def name
    puts("grandpaです")
  end
end

class Papa < Grandpa
  def name
    puts("papaです")
  end
end

class Boku < Papa
  def name
    puts("bokuです")
  end
end

family = [Grandpa.new, Papa.new, Boku.new]

for p in family
    p.name
end

(結果)

grandpaです
papaです
bokuです

結果の通り、forループでnameメソッドを呼ぶ部分は同じですが、それぞれのオブジェクト指向のごとに正しいnameメソッドが実行されています。

この仕組みのおかげで、継承元と同じ名前のメソッドを作っても問題なく動作するようになります。(むしろ、わざと同じ名前のメソッドにすることで、inherit00-1.rbのように処理をシンプルにすることができるのです)

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー

Rubyはどうやって正しいメソッドを探す?

前述の多態性は、感覚的に納得しやすい動きではありますが、コンピュータの動きとしては、奇妙に感じてしまうかとしれません。
(コンピュータは「なんとなくそれっぽい」などの判断はできません)

そこで、多態性を発揮するために正しいメソッドを探す仕組みを、簡単に説明しましょう。

まず、Rubyのクラスは、すべてのクラスが何らかのクラスを継承しているということを知ってください。

そして、その親をたどっていくと、最終的にはBasicObjectクラスという大元のクラスが存在しています。

具体的には、先ほど作ったBokuクラスは、以下のような継承関係の末端にいるわけです。

BasicObject
└ Object
└ Grandpa
└ Papa
└ Boku

あるメソッドの多態性を考えるとき、この図はとても重要です。なぜなら、Rubyは最適なメソッドを探すために、この継承関係を遡っていくからです。

そのため、Bokuクラスのオブジェクトが利用するメソッドnameはまず、Bokuクラスの中に定義されているかどうか探します。もちろん、Bokuクラスにはnameメソッドが定義されていますので実行されますが、仮になければ、継承関係を遡って、Papaクラスを検索し、そこで見つかったnameメソッドを実行します。

もちろん、PapaクラスにもなければGrandpaクラスを探し、と最終的にBasicObjectまで遡って見つからなければエラーを発します。

試してみましょう。

inherit00-2.rb

class Grandpa
  def name
    puts("grandpaです")
  end
end

class Papa < Grandpa
#  def name
#    puts("papaです")
#  end
end

class Boku < Papa
  def name
    puts("bokuです")
  end
end

family = [Grandpa.new, Papa.new, Boku.new]

for p in family
    p.name
end

(結果)

grandpaです
grandpaです
bokuです

Papaクラスにnameメソッドがありませんので、遡ってGrandpaクラスのメソッドを実行しています。

※なお、先ほど図にした継承関係を知るためには、以下のsuperclassメソッドを利用します。

クラス名.superclass

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】

継承の使いどころ

ここまでで、継承のやり方と動きを説明してきましたが、実際に継承はどんなときに使うのが良いのかを説明します。

継承を使うのに最適な使いどころは、「複数種のデータを扱いたい」場合でしょう。

なぜなら、あるデータを表示したり整えたりするとき、そのデータの取得元や型などが違っていると、当然その手順は違います。

同じ「表示」であっても、方やそのままputsで表示できるものが、to_sなどで文字列に変換しないと表示されないもの、そもそもデータを取得するのにDBから取得するものやサイトから取得するものなど、その手段と手順はいろいろとあるでしょう。

データ種別ごとにそれらの処理を行うデータ処理クラスを作ります。そして、必要に応じて最適なデータ処理クラスを継承したクラスを生成すれば、使い手はデータ処理の方法を気にすることなく、表示することができるのです。

また、こうやってデータ処理部分を隔離することで、データ処理の方法が変わって、プログラム全体へ影響が及びません。

もちろん、データの種類が少なければ、それぞれの専用処理を作っても良いですが、あらかじめ継承を利用したプログラムを設計しておくことで、使いやすく拡張しやすいプログラムにすることができます。

※もちろん、これ以外にも最適な使いどころはあると思いますが、継承、多態性が力を発揮するのは、このような「使い手の気持ちになった実装」なのです。

クラスを作る基準(継承のデメリットから考える)

前述のように、継承はうまく使うことで、プログラムの拡張性と利便性を向上します。

しかし、どんなものにもデメリットはあるものです。

そこで最後に、継承を使うことによるデメリットを紹介しつつ、クラスを作るための考え方の基準を説明します。

ただ考え方を説明するよりは、デメリットを知ることで、どんなことに注意してクラスを作れば良いかが明確になるでしょう。

プログラムは読みやすくすること

継承は、既存クラスとの差分だけのプログラムで良いので、とても楽で効率的です。しかし、それを繰り返すことで、いざメソッドを解析しようと思ったときに、どのクラスのメソッドなのかが分からず、継承関係の中をうろうろと探しまわることになります。

これは、明らかにプログラム全体の可読性を阻害しています。プログラムを読みやすく書くのは、バグを防いで再利用性を高める第一歩です。

カプセル化のためには、影響範囲を狭くする

もし、親クラスのメソッドを修正しようと考えたとき、継承している子クラスや孫クラスがそのメソッドを使っているかもしれません。継承先の数にもよりますが、数が多ければ、それだけ修正の影響範囲が広く、把握しづらくなります。そのため、安易に親クラスの修正ができなくなってしまうのです。

クラスのカプセル化というのは、外部との関連や影響をできる限り少なくすることです。その基本を忘れてはいけません。

クラスの目的を明確に

継承の利点は、親クラスの機能を子クラスが共通で使えることです。そのため、便利な処理をすべて親クラスに積んでおけば、子クラスたちや孫クラスも便利に使えると考えてしまいます。

しかし、そのために親クラスが巨大化し、結果的に滅多に使わないメソッドばかりのメンテナンスしにくい何でも屋クラスができあがってしまいます。

クラスというのは、それぞれに必ず目的があります。目的が違えばクラスを分けるべきなのです。

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】

まとめ

クラスの継承について、説明しました。

今回は比較的プログラムが少なかったかもしれませんが、その分、オブジェクト指向の神髄の1つである継承を使って、楽しんでいただけたと思います。

継承は非常に興味深い動きで、効率的で便利な機能ですが、最後に記載したように安易な利用はプログラム全体に大きなマイナスになることもあります。

プログラムの読みやすさ、クラスの目的など、しっかりと考えてプログラムしていかなければいけません。

・クラスを継承すれば、継承元(親クラス/スーパークラス)の機能を利用できるようになる
・Rubyでは、複数のクラスを継承する多重継承はできない
・多態性とは、同じメソッドでも利用するオブジェクトによって呼ばれるメソッドが適切に選択されること
・多態性を実現するため、Rubyはメソッドを探して継承関係を遡っていく
・継承を使うのに最適な使いどころは、「複数種のデータを扱いたい」場合
・カプセル化は、外部との関連性をできる限り小さくすることで実現する
・クラスには役割がある

DMM WEBCAMP ONLINE/プログラミングコースについて

WEBCAMPでは、「どこでも学べる」オンラインコースを開講しています。

初心者・未経験の方でもわずか1ヶ月でプログラミングの基礎を学び、アプリケーション開発をすることができます。

DMM WEBCAMP ONLINEが選ばれる3つの理由

1.学習の仕方がわからなくても安心!初心者に寄り添った学習カリキュラム

これから学習を始める初心者の方や、独学で挫折してしまった方に向けて、アプリケーション作成をゴールとする一気通貫したカリキュラムを提供しています。2500名を輩出しているWebCampだからこその教室でのリアルな受講生の声を反映し、オンラインコースでも初心者に寄り添った学習体験をご提供いたします。

2.つまずいたらすぐ解決!プロのエンジニアに質問し放題

プログラミング学習で挫折する理由の多くは「つまずいた時に聞ける人がいない」ことです。オンラインコースでは、現役エンジニアやプロ講師に、すぐにチャットでの質問が可能です。つまずきをすぐに解消できるので、挫折せずに学習を継続することができます

3.1ヶ月間で終わらなくても大丈夫!カリキュラムは"卒業後"も"無料"で利用可能

受講したいけど、仕事が急に忙しくなるかもしれないから受講するか迷っている・・・そんな方も多いのではないでしょうか?ご安心ください。カリキュラムは期間終了後も「無料」で使うことができます。また、しっかり学習時間を確保した方も、振り返って学習することでプログラミングスキルがご自身に馴染んできます。

▼まずは無料でWEBデザインのカリキュラムを体験しよう!

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

おすすめの記事