スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

オブジェクト指向入門 第4回 継承と実装

前回は、1つのオブジェクト(物体)が様々なクラス(集合)型のインスタンス(実例)になれる事を書いてみました。

しかし、全てのオブジェクトが全てのクラスのインスタンスになれるわけではありません。
ケータイは非常に多機能ですが、さすがに電子レンジのインスタンスにはなれません。

これには2つルールがあります。

  ・継承(Inherit)
  ・実装(Implement)

クラスAから生成したオブジェクトがB型インスタンスとなるには、クラスAがBを継承しているか実装している必要があります。

InheritとImplementは、次の意味の英単語です。

  ・Inherit・・・相続する、(性質・体質など)を受け継ぐ
  ・Implement・・・(約束・計画など)を実行する、(要求・条件など)を満たす

オブジェクト指向の継承や実装も、この英語の意味に沿ったものになっています。


ここで質問ですが、次の中から正しいと感じる文章を選んでください。
深く考えず、直感的に選んでください。

  ①ケータイは、メールしたり写真を撮れる「電話の一種」である
  ②ケータイは、通話したり写真を撮れる「メールクライアントの一種」である
  ③ケータイは、通話したりメールできる「カメラの一種」である
  ④ケータイは、通話したりメールしたり写真を撮れる「新クラス」である

どれが正解というわけではありませんが、ケータイが何を継承して何を実装しているかのヒントになります。


個人的には①なので、以降は①ベースで書きます。
①を選んだ方は、たぶん次の説明を受け入れやすいと思います。

  ・ケータイは電話を継承している(電話の特性を受け継いでいる)
  ・ケータイはメールクライアントを実装している(メールクライアントの条件を満たしている)
  ・ケータイはカメラを実装している(カメラの条件を満たしている)

クラスAがクラスBを継承しているとき、クラスAを派生クラス、クラスBを基本クラスといいます。
①の場合、電話が基本クラスでケータイが派生クラスになります。

継承関係は「汎化/特化」という関係も表しています。
クラスは集合なので、汎用的な集合と特殊な部分集合の包含関係となります。
電話という大きな集合の中に、ケータイという部分集合が含まれているイメージです。

継承をサポートするプログラミング言語では通常、派生クラスは基本クラスの特性(操作/属性など)を自動的に引き継ぎます。
これにより、基本クラスに書いた処理は再度派生クラスに書く必要はなく、重複コードを減らすことができます。


一方、実装とは条件を満たすことです。
条件を満たせばOKという視点なので、クラスの集合論的な視点とは大きく異なっています。

JavaやC#では、この条件をインターフェイスという形式で表現します。
インターフェイスは、それを実装するクラスが記述すべき操作の定義です。

インターフェイスを実装するクラスは、そのインターフェイスに定義された全操作の処理を記述する責任を負います。
処理を記述すると「実装した/条件を満たした」ことになります。


①の文章をクラス図で図示しますと以下のようになります。

MobilePhone.jpg

実装の概念を取り入れましたので、ケータイクラスとカメラクラスの間に直接的な関係が無くなりました。
つまり、ケータイはカメラの部分集合ではない事、集合論的には無関係な事も図示できたと思えます。

前回のケータイを使用する様子のコードも、インターフェイスを考慮しますと少し変わります。

    // ケータイを用意する
    MobilePhone mobilePhone = new MobilePhone();

    // まず、ディスプレイを開く
    mobilePhone.OpenDisplay();

    // 電話する
    IPhone phone = mobilePhone();
    phone.Call("110");

    // メールする
    IEmailClient emailClient = mobilePhone();
    emailClient.Send("xxxx@yyy.zz", "Hello!");

    // 写真を撮る
    ICamera camera = mobilePhone();
    camera.TakePicture();

    // ディスプレイを閉じる
    mobilePhone.CloseDisplay();

ただ、Phone/EmailClient/Cameraクラス型をIPhone/IEmailClient/ICameraインターフェイス型にしただけです。


さて、繰り返しになりますが、上の①~④に正解はありません。
例えば機器構造の視点で見ると、ケータイが普通の電話から継承している部品はほとんど無いかもしれません。
また、カメラの技術進歩の視点で見ると、ケータイもカメラクラスの重要な派生クラスかも知れません。

つまり、クラス間の関係はプログラム要件や仕様に合わせる必要があります。


【まとめ】
  ・継承は特性を受け継ぐ
  ・実装は条件を満たす
  ・クラス間の関係は、プログラム要件に合わせる


次回は、継承を使うとプログラム変更が簡単になる様子をサンプルプログラムで書いてみたいと思います。
スポンサーサイト

テーマ : ソフトウェア開発
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

プロフィール

きっぽ

Author:きっぽ

カテゴリ
最新記事
最新コメント
最新トラックバック
月別アーカイブ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。