javaにおけるインターフェースと抽象クラスの使い分けについて。

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,461
退会済みユーザー

退会済みユーザー

javaにおける抽象クラスとインターフェースの使い分けについて質問です。
とあるブログを見ていると、次のようなことが書いてありました。

「Javaは、複数の実装を許す型を定義するために抽象クラスとインターフェースの2つの仕組みを提供している。
クラスとインターフェースの違いは以下の2点である。

抽象クラスはいくつかのメソッドに対する実装が許されていて、インターフェースは許されていない。
抽象クラスで定義された型を実装するには、クラスはその抽象クラスのサブクラスでなければならないが、インターフェースの場合には、ルールに従って要求されるメソッドを全て定義しているクラスであれば、クラス階層のどこに位置していても、インターフェースを実装することが許されている。

これにより、抽象クラスとインターフェースは次のように使い分けることが出来る。

抽象クラスは、実装の継承にあたり、主に同一の継承階層に属するクラスに共通する処理を持ったスーパークラスとして定義する。
インタフェースは、仕様の継承にあたり、主に継承階層の異なる複数の型をオブジェクトに持たせるために定義する。」

この文章中で出てくる「型」という言葉がよく理解できません。
「複数の実装を許す型」と「継承階層の異なる複数の型」の型って一体どういう意味なのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

「複数の実装を許す型」と「継承階層の異なる複数の型」の型って一体どういう意味なのでしょうか? 

「クラス」と読み替えていいです。

ちょっと乱暴だったので追記。
本当に単純に、型<->クラスと読み替えると
「主に継承階層の異なる複数の型をオブジェクトに持たせるために定義する」
が若干意味わからなくなりますね。

型って何かと言えば、wikipedia曰く

データ型(データがた、data type)とは、(コンピュータにおける)データ(値)の種類に関する分類である。

例えば32bit符号付き整数型とか文字列型とか金額型とか大気中のアイスクリーム濃度型など、
「そのデータの種類が何であるか」という情報ですね。

各クラスも抽象クラスもインターフェースもデータの種類を表すので型ですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

インターフェースについてです、
身近にあるボタンを例にします。
まず、ボタンは押すことができますね。つまり、ボタンの仕様として「押すことができる」というものがあります。
これをボタンは「電気のボタン」や「マウスのボタン」など様々なボタンがあります。それぞれ動作は異なりますが「押すことができる」という点では同じです。これが継承階層が異なる複数の型に実装できるという意味です。

次は抽象クラスです。
今度はマウスを例にすると、ほとんどのマウスは右クリックと左クリック、移動距離を計算することでき、それらの情報を外部に送信することができます。
これらのマウスがマウスとしての役割を果たすための機能を抽象クラスにすることで、この抽象クラスを継承したクラスはすべてマウスとして使うことができます。これが複数の実装を許す型という意味です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/04 22:29

    継承階層の異なるクラスというのがインターフェースEのことで、オブジェクトというのがその例だと、A,B,Cとなるわけですね?

    キャンセル

  • 2016/08/05 00:17

    違います。先ほどコメントがイマイチでした。
    継承階層が異なるクラスとは「A,B,C」と「X,Y」のことです。この異なる継承階層に対してインターフェースEを実装します。
    CにEを実装するとCは「A,B,C,E」のクラスを持ちます。YにEを実装するとYは「X,Y,E」のクラスを持ちます。

    キャンセル

  • 2016/08/06 14:22

    コメントに対する返信本当にありがとうございます。
    クラスCがA,B,Cのクラスを持つという言い方は普通なのでしょうか。
    非常に違和感があるのです。
    yogaさんが仰りたい事というのは全く関係ない二つのクラス群(A,B,CとX,Y)があって、条件さえ満たせば、インターフェースはどちらにも実装できるということですね。(抽象クラスならそれは無理)

    キャンセル

+1

おそらく このブログの記事 をご覧になられたのではないかと思います。

「複数の実装を許す型」における型とは、抽象クラスとインターフェースの両方におけるメソッドのことです。
「継承階層の異なる複数の型」における型とは、インターフェースにおけるメソッドのことです。
つまり、ここで言っている型とはメソッドのことです。
※オブジェクト指向における型の話など処々あるとして、ブログ記事の論点として端的に言えばの話。

「複数の実装を許す型」は「実装のないメソッド(異なる実装をさせるメソッド)」のことで
「継承階層の異なる複数の型」は「インターフェースに定義された複数のメソッド」のことです。

質問に記載された文章について、ブログの記事として言わんとしていることは、ブログ記事内の「型定義にインターフェースを利用する」と「骨格(スケルトン)実装に抽象クラスを利用する」に記載されているサンプルに集約されています。このサンプルの見て理解をし、質問文に記載された文章を精査することで解釈しようとしない方が良いと思います。

インターフェイスの解説は正しくないです。「インタフェースは、仕様の継承にあたり、主に継承階層の異なる複数の型をオブジェクトに持たせるために定義する。」ものではありません。インタフェースはメソッドのインタフェース(呼び出し方)を統一するために定義するものと解釈する方が正しいです。主に継承階層が異なるのは、継承階層が同じならその階層の適した層のクラスで抽象メソッドとして定義されるからです。型(メソッド)が複数であるわけでもありません。ブログ記事では記事内の承前により仕様の継承と書かれているのですが、"仕様の統一"と表現されるべきものでしょう。
ブログ記事ではインターフェイスが多重継承が許されていると書いる点も誤りです。実装を引き継がないものは継承と言いません。そのため記事内でも書かれていますがミックスインと言われます。インターフェイスに継承の概念はありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/06 14:29

    回答ありがとうございます。
    そうすると、型というのはメソッドということでしょうか。
    「継承階層の異なる複数の型」についてですが、これは複数のメソッドと言われていますが、同時にメソッドが複数あるわけではないとも言われています。
    一体どっちなのでしょうか。

    キャンセル

  • 2016/08/06 16:16

    そうです。型というのはメソッドです。
    "ここで言う"および"ブログの記事においては"という前提での話です。

    混乱されている中、私の回答がさらに混乱を招いてしまったようですね。yonaさんとのやり取りされている中で理解されている内容が最も正しい理解に近いです。

    「継承階層の異なる複数の型」の部分について回答します。
    「どっちなのか」というものではありません。
    複数のメソッドと言った部分は、型=メソッドと解釈する私の回答において、型を単純にメソッドに置き換えると「継承階層の異なる複数のメソッド」となります。よって複数のメソッドと言いました。
    次にメソッドが複数あるわけでないと言った部分は、インターフェイスの説明として「継承階層の異なる複数のメソッド」とした場合、「インターフェイスは継承階層の異なる複数のメソッドを持ったものである」となります。しかし、インターフェイスはメソッドが複数であることが条件なわけではありません。なので、メソッドが複数あるわけではないと言いました。
    billさんは"同時に"と読まれましたが、私は"別の話"として「インターフェイスの説明として複数のメソッドというのは間違いで、複数あるわけではない」と言いたいのです。

    型というものは抽象的なもので、クラスともメソッドとも解釈することが可能です。ブログの記事はどちらでもそれなりに解釈できてしまうのと、ところによりクラスの事を指したりメソッドの事を指したりしている雰囲気です。
    ozwkさんがその点を指摘されており、yonaさんがクラスとしての解釈と説明を、私がメソッドとしての解釈と説明をしている構図になっています。yonaさんとのやり取りの理解をベースに考えてください。
    yonaさんとのA,B,C / X,Y と E の関係を図化してみてください。今回の場合型を言葉で理解は少し厳しいかなと思います。

    キャンセル

  • 2016/08/06 22:59

    なるほど。理解できました。
    回答ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる