オブジェクト指向プログラミング

初心者でもわかる|オブジェクト指向プログラミングの基本【基礎概念】

目次(ここを押すと開閉します)
  1. オブジェクト指向プログラミング(OOP)の概要
    1. オブジェクトとはデータとそれに関連する処理をまとめたもの
  2. クラスとインスタンス
    1. オブジェクトが持つ属性とメソッドを定義したものがクラス
    2. クラスの属性に値を持たせ実体化したものがインスタンス
    3. 「長方形」というクラスを考えてみる
    4. 長方形クラスのインスタンスを考えてみる
    5. まとめ
    6. 補足:オブジェクト≒インスタンス?
  3. カプセル化
    1. カプセル化とは内部情報を隠蔽すること
    2. まとめ
    3. 補足:カプセル化=アクセサの利用?
  4. 継承
    1. 継承とは、あるクラスの特性を引き継いで派生させた、新たなクラスを作成すること。
    2. 「自動車」クラスで継承関係を考えてみる
    3. 継承の目的(メリット)
    4. まとめ
    5. 補足:処理の共通化(コードの再利用)が継承の目的・メリット?
    6. 補足:継承と委譲について
    7. 補足:継承元と継承先クラスの呼び方について
    🖋 このページはここから
  5. 抽象|抽象クラスとインターフェース
    1. 抽象クラスとは継承を前提としたクラス
    2. インターフェースとはクラスの使い方だけを定義したもの
    3. インターフェースは何のためにあるのか?
    4. 抽象とは抽象クラスとインターフェースの総称
    5. まとめ
  6. 総まとめ|オブジェクト指向プログラミングの目的
    1. オブジェクト内は結合度を高く、オブジェクト間は結合度を低く保ち、保守性、拡張性を高める。

抽象|抽象クラスとインターフェース

抽象クラスとは継承を前提としたクラス

抽象クラスとは、継承されることを前提とした特殊なクラスです。抽象クラス自身はインスタンス化できず、これを継承したサブクラスを定義して使用します。

前頁の継承で挙げた自動車クラスの例でもう少し詳しく説明します。

全ての自動車が持つ特性、すなわち、属性やメソッドは「自動車」クラスに定義します。前回の例では、属性として「速度」、メソッドとしては「アクセルを踏む」、「ブレーキを踏む」などが該当します。

ユーザーから見れば、「自動車」クラスは必要な特性が全て備わっているので扱うことができます。しかし、実際に操作する自動車はサブクラスである具体的な車種のはずです。これは、「自動車」クラスは実体を持たない抽象的なものであるということを示しています。

この様な抽象的なクラスでは、メソッドが必要なことはわかっていても、その実装の詳細はわからないことがあります。「自動車」クラスの「アクセルを踏む」メソッドもその1つとして考えられます。もっと具体的な車種ごとに「アクセルを踏む」処理の内容が異なるとすれば、「自動車」クラスでは実装ができず、サブクラスである各車種で実装する必要があります。

この「自動車」クラスの様に、メソッドはあるが、その実装(具体的な処理内容)を持たないクラスを抽象クラスといいます。

ただ、抽象クラスはメソッドの実装を持つこともできます。例えば「ブレーキを踏む」メソッドが、全ての自動車で基本的に共通の処理であれば、「自動車」クラスに実装できます。

また、「アクセルを踏む」についても、処理の流れが全ての自動車で共通であれば、その流れだけを実装しておくこともできます。

処理の流れとは以下の様なものです。

  • ①エネルギー源(ガソリン、電気など)を動力源(エンジン、モーターなど)に注入する。
  • ②動力源を動かして動力を得る。
  • ③動力をタイヤに伝えて加速する。

流れだけはスーパークラスで決めておき、①から③の実装はサブクラスにまかせるということができます。これは、処理内容は似ていて共通する部分が多いのに、細部がサブクラスによって異なる場合などに有効です。異なる部分だけをサブクラスに実装させて、大部分の共通箇所はスーパークラスで実装することで、サブクラスの実装が楽になります。

インターフェースとはクラスの使い方だけを定義したもの

インターフェースとは、クラスが持つメソッドとその使い方だけを定義し、ユーザーに示すものです。メソッドの使い方を示すとは、メソッド名と引数、戻り値の型を明確にすることです。メソッド名と引数、戻り値の型の組み合わせをシグネチャと言います。

インターフェースはシグネチャだけを決め、メソッドの実装は持ちません。また、それ自身はクラスではなく、属性も持ちません。

※言語によってはメソッドの実装及び属性を持たせることも可能ですが、その場合でもシグネチャのみが基本です。

インターフェースは何のためにあるのか?

インターフェースは何の実装も持ちませんので、意味がないように思えるかもしれません。使うなら抽象クラスの方が便利にも思えます。ですが、インターフェースは抽象クラスよりとても重要であり、使用頻度も圧倒的に多いです。

抽象クラスは継承して使うことが前提だと前述しました。そして、継承には実は、原則として継承元のスーパークラスは1つだけという制約があります。

「自動車」クラスのサブクラスに「ガソリン自動車」と「電気自動車」があったとします。さらに、ガソリン自動車にはAとB、電気自動車にはCとDというサブクラスがあるとします(A、B、C、Dは具体的な車種)。Aの継承元はあくまで「ガソリン自動車」であり、「自動車-ガソリン自動車-A」の様に、親-子-孫の継承は問題なくできます。

ところがここで、AとCには自動運転機能があるとしましょう(自動運転の使い方は共通だとします)。これを継承関係で表すとどうなるでしょう。

AとCの継承元として「自動運転車」を追加できれば良いですが、継承元が1つという制約があるのでこれはできません。すると、どう考えても「is-a関係」を保ったまま継承関係で解決することはできないと思います。

ここで、使われるのがインターフェースです。

ユーザーがAとCをただの「自動車」ではなく「自動運転車」として扱う場合、AとCに「自動運転車」インターフェースを付加することで可能となります。これでユーザーからすると、AとCは「自動運転車」としての共通の使い方が保証されることになります。

ただ、インターフェースのメソッドは何の実装もありませんので、インターフェースを付加したクラスでは、インターフェースのメソッドを全てオーバーライドして実際の処理を実装する必要があります。インターフェースをクラスに付加することを、インターフェースを「実装」すると言いますが、まさにその言葉どおり処理の実装は各クラスで行います。

AとCに「自動運転車」インターフェースを実装するにあたって、自動運転処理の共通化が可能であれば、共通処理を持つ別のクラスへ「委譲」して実現します。決して、「自動車」クラスに自動運転処理を実装してはいけません。自動運転は全ての自動車が持つ機能ではありませんから。

とにかく、インターフェースを実装したことにより、AとCは「自動車」としての扱いの他に、「自動運転車」としての扱い方もできるようになりました。

インターフェースの特徴として、1つのクラスで異なる複数のインターフェースを実装できる点があります。継承の様な制約はありませんし、何らかのサブクラスであっても特に関係なく実装できます。

インターフェースの本質は、クラスの使い方をユーザーに明示することです。あるユーザーからすればただの「自動車」、別のユーザーからすれば「自動運転車」という使い方ができるということです。また、1つのクラスが異なるインターフェースの実装やスーパークラスを持つことで、ポリモーフィズムを活かしてプログラムの保守性、拡張性を向上することができます。

抽象とは抽象クラスとインターフェースの総称

抽象クラスとインターフェースを総称して抽象といいます。どちらも実体をもたない、それだけでは抽象的なものだからです。抽象的なものなのでインスタンス化はできず、より具体的なサブクラスやインターフェースを実装したクラスをインスタン化して使用します。

抽象を利用してポリモーフィズムを実現することで、複数のクラスが過剰に依存し合って、プログラムが複雑になることを防ぐことができます。

これについては後日、【実践編】で詳しく説明します。

まとめ

  • 抽象クラスとは、継承されることを前提とした、インスタンス化できないクラス。処理が実装されたメソッドと実装のないメソッドを併せ持つ。

  • インターフェースとは、クラスが持つメソッドとその使い方だけを定義し、ユーザーに示すもの。各クラスはインターフェースをいくつでも実装できる。

  • 抽象とポリモーフィズムにより、オブジェクト間の依存度を下げ、個々のオブジェクトの独立性を保つことができる。

総まとめ|オブジェクト指向プログラミングの目的

オブジェクト内は結合度を高く、オブジェクト間は結合度を低く保ち、保守性、拡張性を高める。

オブジェクトやそのメンバーの関連性の強さを結合度と言います。この結合度を適切に保ち、プログラムの保守性・拡張性を高めることがオブジェクト指向プログラミングの目的と言えます。

  • オブジェクト内の結合度が高くなるよう、関連性の高いものだけを1つのオブジェクトとし、カプセル化します。これにより、プログラム修正などの保守性が上がります。

  • オブジェクト間の結合度が低くなるよう、カプセル化、抽象、ポリモーフィズムを利用します。これにより、保守性と、機能追加などの拡張性が上がります。

オブジェクト指向プログラミングは、それをよく理解し実践しなければ、保守性および拡張性の向上にはつながりません。よく理解して実践することが重要です。

1
2
3
4

basic-knowledge-of-web-appWebアプリケーションとは|プログラミング初心者でも必要な基礎知識前のページ

4Kディスプレイは画質が悪い!?<動画視聴の注意点と解決法>次のページ4kdisplay for video

コメント
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


ピックアップ

  1. 4Kディスプレイで作業効率UP #3
  2. 4kdisplay for video

最近の記事

  1. recommended pc
  2. おすすめ動画配信サービス3選
  3. 4kdisplay for video
  4. オブジェクト指向の基本概念
  5. basic-knowledge-of-web-app
PAGE TOP