質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

3105閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

2クリップ

投稿2016/08/03 09:22

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

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

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

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

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

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

stereo_code👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

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

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

投稿2016/08/03 09:49

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/03 10:58

Aが親クラス、Bが子クラス、Cが孫クラスとし、インターフェースDを考えると、A,B,Cのそれぞれは条件を満たすなら、つまりインターフェースに宣言されている抽象メソッドをオーバーライドするなら、インターフェースを実装することができるというような意味になりますね。 私が悩んでいるのは「型」という言葉の意味です。 javaでいうクラスのことなのか、それともメソッドなのか、それとも違う概念なのかが判別つかないのです。
yona

2016/08/03 12:21

オブジェクト指向では型とクラスは別物です。 型は特定の関連を持つオブジェクトの集合です、クラスは型に対する操作を実装したものです。 Javaにおいては型とクラスは同義ですね。 今回の型でもクラスでもいいと思いますが。
退会済みユーザー

退会済みユーザー

2016/08/03 13:10

何度もすいません。 「複数の実装を許すクラスを定義するために抽象クラスとインターフェースの2つの仕組みを提供している。 」 「主に継承階層の異なる複数のクラスをオブジェクトに持たせるために定義する。」 上の文章は「複数の(抽象メソッドの)実装を許すクラスを定義するために」とすれば、意味は十分通じると思うのですが、下の文はこれで成り立っているのでしょうか。 全体の文章を見ると、意味合いは恐らく私の言ったようなことを指しているとは思うのですが、この結論の文章が分かりません。 これはきちんと意味をなしているのでしょうか。
yona

2016/08/03 13:44 編集

成り立っています。 先ほどのコメントにあったA,Bを使います。 このA,Bとは別に親クラスX,子クラスYをつくるとX,YとA,Bは継承階層が異なりますよね? この2つの異なる継承階層では抽象クラスを使った実装の継承はできません。しかし、インターフェースなら仕様の継承が可能で、実装することで擬似的に実装の継承ができます。
退会済みユーザー

退会済みユーザー

2016/08/04 00:09

うーん、なるほどです。 そうすると、「主に継承階層の異なる複数のクラスをオブジェクトに持たせるために定義する。」となるわけですね。 「クラスをオブジェクトに持たせるために」とはどういう意味なのでしょうか。
yona

2016/08/04 01:12

継承を使うと型は1つの継承階層しか持てません。A,B,Cで考えるとBはA,Bの型を持っています。CはA,B,Cの型を持っています。このCにさらにEを実装するとCはA,B,C,Eの型を持つことになります。 このようにしてインターフェースを使うことで継承階層とは関係のない型を複数追加することができます。
退会済みユーザー

退会済みユーザー

2016/08/04 13:29

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

2016/08/04 15:17

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

退会済みユーザー

2016/08/06 05:22

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

0

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

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

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

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

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

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

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

投稿2016/08/03 09:41

編集2016/08/04 01:01
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

投稿2016/08/05 19:48

Hiroshi-Aoki

総合スコア804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/06 05:29

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

2016/08/06 07:16

そうです。型というのはメソッドです。 "ここで言う"および"ブログの記事においては"という前提での話です。 混乱されている中、私の回答がさらに混乱を招いてしまったようですね。yonaさんとのやり取りされている中で理解されている内容が最も正しい理解に近いです。 「継承階層の異なる複数の型」の部分について回答します。 「どっちなのか」というものではありません。 複数のメソッドと言った部分は、型=メソッドと解釈する私の回答において、型を単純にメソッドに置き換えると「継承階層の異なる複数のメソッド」となります。よって複数のメソッドと言いました。 次にメソッドが複数あるわけでないと言った部分は、インターフェイスの説明として「継承階層の異なる複数のメソッド」とした場合、「インターフェイスは継承階層の異なる複数のメソッドを持ったものである」となります。しかし、インターフェイスはメソッドが複数であることが条件なわけではありません。なので、メソッドが複数あるわけではないと言いました。 billさんは"同時に"と読まれましたが、私は"別の話"として「インターフェイスの説明として複数のメソッドというのは間違いで、複数あるわけではない」と言いたいのです。 型というものは抽象的なもので、クラスともメソッドとも解釈することが可能です。ブログの記事はどちらでもそれなりに解釈できてしまうのと、ところによりクラスの事を指したりメソッドの事を指したりしている雰囲気です。 ozwkさんがその点を指摘されており、yonaさんがクラスとしての解釈と説明を、私がメソッドとしての解釈と説明をしている構図になっています。yonaさんとのやり取りの理解をベースに考えてください。 yonaさんとのA,B,C / X,Y と E の関係を図化してみてください。今回の場合型を言葉で理解は少し厳しいかなと思います。
退会済みユーザー

退会済みユーザー

2016/08/06 13:59

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

0

最新リリースは、マリオを有名にした古典的なゲームに敬意を表すると同時に、プレイヤーに象徴的なキャラクターの進化の次の章を紹介します。fireboy and watergirl

投稿2023/06/27 08:56

toyotamasculine

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問