オブジェクト指向の継承について今日は紹介するよ!
- オブジェクト指向の継承ってなに?
- オブジェクト指向の継承は何のためにあるの?
- 説明だけだとわからないからコードで書きたい
などの疑問をお持ちの方の悩みを解決できる記事になっています!
オブジェクト指向は初心者の人にとって難しいかもしれません。色々なサイトで見たけど、よくわからなかったという人も多いのではないでしょうか。
オブジェクト指向の重要な概念で、次のようなものがあります。
- クラス
- カプセル化
- 継承
- ポリモーフィズム
オブジェクト指向を習得するためには、これらの理解が必要です。オブジェクト指向が扱う範囲は広いです。そのため、基本をしっかりと抑えておかないと、挫折してしまうかもしれません。
この記事では、オブジェクト指向の継承、継承の使い方などを完全初心者向けに解説します!
サンプルのコードをあわせて説明しますので、実際にコードを書いて動作確認してみましょう!
記事を読めば、オブジェクト指向のクラスについて理解ができますよ!
- オブジェクト指向の継承の使い方を知りたい人
- オブジェクト指向の継承をコードで書けるようになりたい人
- オブジェクト指向を一言で説明できない人
目次
オブジェクト指向の継承を学ぶ前に
オブジェクト指向の継承を学習する前に注意してほしいことがあります。
オブジェクト指向の継承を理解するために、実際にコードを書いて動作確認をしてください。
なぜなら、コードを書かずに頭だけで理解することは難しいからです。
サンプルコードを書いて動作確認することを「写経」といいます。
写経することで、継承の書き方や、なぜ動くのかを確認することができます。初心者の頃は横着してコピペする人が多いですが、これは非常にもったいないです。
手を動かして書くことで、記憶の定着が上がり、コードを書くことに慣れます。
実際に、プロのエンジニアも新しいプログラミング言語を習うときは、写経する人が多いです。
写経することで、頭の整理がしやすいからですね。
それに、体で覚える感覚を養うことができます。
私も写経は必ずやります。
オブジェクト指向をしっかり理解したい人は、サンプルコードを書くようにしてくださいね。
それでは、見てみましょう!
Rubyの実行環境
この記事では、継承のサンプルコードは「Ruby」を書きます。
Rubyの実行環境は手元のパソコンでもいいですし、オンライン上でも大丈夫です。
例えば、こちらのサイトならオンライン上でコードを書くことができます。
オブジェクト指向ってなに?
オブジェクト指向とは、システム開発を効率的に行うための総合的な技術を指します。
オブジェクト指向は当初はプログラミング言語として開発されました。「クラス」「継承」「ポリモーフィズム」などの概念を取り入れ、オブジェクト指向プログラミング言語(OOP)と呼ばれるようになりました。
その後、プログラミング以外にもデザインパターンやUML、モデリングなどにも応用され、オブジェクト指向という概念が形成されました。
オブジェクト指向の基本についてこちらの記事で詳しく解説しています。オブジェクト指向の継承を理解するためにも目を通しておきましょう。
【保存版】オブジェクト指向とは?プログラミング初心者向けに解説!オブジェクト指向のクラスとは
クラスとは「種類」「分類」を意味し、「性質が同じものの集まり」です。
Rubyでクラスを書くときは、class
キーワードを使います。
次の例では、車を表すCar
クラスを定義しています。
class Car
def initialize(name, color, model_year)
@name = name
@color = color
@model_year = model_year
end
attr_accessor :name, :color, :model_year
end
インスタンスは、new
を使って次のように書きます。
class Car
def initialize(name, color, model_year)
@name = name
@color = color
@model_year = model_year
end
attr_accessor :name, :color, :model_year
end
# インスタンスをつくる(インスタンス化させる)
toyota = Car.new("TOYOTA", "黒", "20年式")
puts toyota.name
puts toyota.color
puts toyota.model_year
クラスとインスタンスの違いや、クラスの使い方はこちらで解説しているので確認してみましょう。
オブジェクト指向のクラスとは?初心者でもわかる!オブジェクト指向の継承とは
オブジェクト指向の継承とは「共通の特徴を共有すること」を目的とした仕組みです。
「共通の特徴を共有する」とはどういうことでしょうか。
オブジェクト指向のクラスは抽象的なものから具体的なものになると、共通の特徴を抽出できます。
例えば、動物で考えてみましょう。
「動物」という抽象的な概念から「人」、「エンジニア」と具体的な概念を表すと次のようになります。
「動物」→「哺乳類」→「人」→「男性」→「エンジニア」
ここで、この中から全てに当てはまる共通点を探してみましょう。
おそらく次のようなものが思いつくのではないでしょうか。
- 食べる
- 寝る
動物としての基本的な能力は、全ての分類で当てはまりますね。
しかし、エンジニア独自の能力はどうでしょう。
- プログラミングをする
- パソコンを使いこなす
- リモートワークをする
全ての「哺乳類」はこれらを行うことが可能でしょうか。
また、全ての「人」「男性」にも当てはまるでしょうか。
これらはエンジニア独自の「ふるまい」のため、その他の分類には当てはまりませんよね。具体的な機能は、それぞれの分類が所有しているので抽象化をすることはできません。
しかし、前述した「食べる、寝る、走る」は全てに当てはまります。
この「動物」の能力をそれ以下の具体的な分類たちが引き継ぐことができます。
この能力を引き継ぐ(共有する)仕組みを、継承と呼びます。
なぜ、継承が必要なのか
では、なぜ継承がオブジェクト指向に必要なのでしょうか。
オブジェクト指向の目的は、「効率的なシステム開発をする」ことです。
継承を利用することによって、効率的なクラス設計をすることができます。
例えば、先程の動物の例で考えてみましょう。
「動物」→「哺乳類」→「人」
これらをクラスにしてみます。
クラス | プロパティ | メソッド |
動物 |
|
|
哺乳類 |
|
|
人 |
|
|
「メソッド」に注目してください。
「食べる」「寝る」が全てのクラスに存在しています。
クラス | プロパティ | メソッド |
動物 |
|
|
哺乳類 |
|
|
人 |
|
|
これは共通のメソッドであり、同じふるまいをします。
同じ動作をするのであれば、共通化することができそうですよね。
この共通化を継承を使って表現することができます。
もし、同じ動作をする機能を全てのクラスに定義してあったらどうなるでしょうか。
「哺乳類」「人」だけでなく、「爬虫類」「両生類」「鳥類」と増えて、100個のクラスに「食べる」「寝る」機能を定義するとしたらどうでしょう。
仮に、「食べる」機能の中身を変えたら100個のクラスを変更しなければなりません。
これは、とても非効率ですよね。
継承を使って、「動物」クラスだけに「食べる」「寝る」を定義しておけば変更があったとしても、一箇所だけの修正でおさまります。
このように、継承はプログラミング開発を効率良く行うための手法なのです。
継承関係を表す
オブジェクト指向の継承では、それぞれのクラスの継承関係を明示的に分ける必要があります。
抽象的のものと具体的なものを明確に分けて、共通点を見つけるためです。
スーパークラス
オブジェクト指向では全体集合を「スーパークラス」と呼びます。
集合論では「スーパーセット」と呼びますが、同様のものです。
スーパークラスは抽象的な概念になり、具体的なものの集合になります。
例えば、「哺乳類」「爬虫類」「鳥類」というクラスがあれば「動物」というクラスを定義し、スーパークラスにすることができます。
サブクラス
「サブクラス」はスーパークラスに属するクラスを指します。
スーパークラスよりも、より具体的なクラスになり、独自の性質やふるまいを持ちます。
先程の例で言うと、「動物」がスーパークラスとしたら「哺乳類」「爬虫類」「鳥類」がサブクラスになります。
継承の書き方
それでは、実際に継承を書いてみましょう!
Rubyの継承は、<
キーワードを使って表現します。
class クラス名 < 継承したいクラス名(スーパークラス)
end
まずは、スーパークラスとなる動物クラス(Animal)を定義します。
class Animal
def eat
puts "eat!"
end
def go_to_sleep
puts "sleep!"
end
end
そして、スーパークラスを継承する哺乳類クラス(Mammal)を定義します。
class Mammal < Animal
end
これで、哺乳類クラス(Mammal)は動物クラス(Animal)のeat
とgo_to_sleep
を継承しました。
それでは、インスタンスを生成して動きを見てみましょう。
class Animal
def eat
puts "eat!"
end
def go_to_sleep
puts "sleep!"
end
end
class Mammal < Animal
end
# インスタンス化させる
mammal = Mammal.new()
# Animalクラスのメソッドを使える
puts mammal.eat
コードの実行結果は次の通りです。
哺乳類クラス(Mammal)はeat
メソッドを実装していませんが、使うことができました。
これは、動物クラス(Animal)のメソッドを継承したためです。
このように、継承を使うことで複数のクラスに共通のプロパティやメソッドを持たせることができます。
サブクラスである哺乳類クラス(Mammal)は哺乳類独自の機能をもつことができます。
複数のクラスの共通点と相違点を見つけ出して適切に分類する、これがオブジェクト指向の継承になります。
まとめ
この記事では、オブジェクト指向の継承についてまとめました。
最後にもう一度内容を確認しましょう。
- オブジェクト指向の継承とは「共通の特徴を共有すること」を目的とした仕組み
- 継承をすることで、共通点と相違点を見つけ出して適切に分類できる
- オブジェクト指向のクラスの分類はスーパークラスとサブクラスがある
- スーパークラスは抽象的な概念で、全体集合
- サブクラスはスーパークラスに属する具体的な概念で、部分集合
オブジェクト指向は難しい概念ですが、基礎を理解し、実践すれば身に付きます!
オブジェクト指向の継承以外にも、クラス、カプセル化、ポリモーフィズムも重要な概念です。
こちらもあわせてしっかり確認しておきましょう!