No.6ベストアンサー
- 回答日時:
>>本質的には interface と abstract
>は同列に対比されるような概念ではありません
>
>この事について、もう少し説明して頂けますでしょうか
ごめんなさい。もう一度考え直しまして、この発言は撤回することにしました。
interface はまったく別なクラスに使うもの、abstract は兄弟関係のある
クラスに使うもの、ということで本質的に違うやんと思ったのですが、
実装を継承せずにメソッドや変数を規定するという働きは共通なので、そっちに
注目すると、同類ですね。
参考になるか分かりませんが、もうひとつ。
interface は基本的にすべて public ですが、 abstract はそうでない場合も
あります。interface は継承関係のない複数のクラス間のやりとりを規定するもの
なので本質的に public でなければならないのに対して、 abstract は(たとえば
Template Method パターンで使われるような場合)、public にする必要がないためです
したがって、「継承関係のない他のクラスに使わせるようなメソッドの定義」
をする場合はたいてい interface にするべきです。そのほうが、外から使えるのは
これだというのがわかりやすくなりますし。
この点、ANo.#5 に私も同意です。
ちなみに、interface と abstract の変更は随時やってます。
>感覚的に、interfaceを使ってまずは航空管制英語の定
>義をし、abstractを使って(地球人クラスの中で)航空
>管制英語の実装を出来るだけし、後は(日本人クラスな
>りドイツ人クラスなりで)残りの実装を試みたほうが、
>柔軟性があると考えてよろしいでしょうか?
そういうことです。
No.5
- 回答日時:
abstract classにするかinterfaceにするか迷うような場合には、interfaceを使用すべきと考えます。
あとで「多重継承ができない!」と困ることがありません。abstract classは何かを実装するクラスのベースとするものであって、それ自体にinterface的な役割を持たせない方が設計として柔軟になります。何でしたら、あるinterfaceをimplementsしたabstract classがあってもまったく問題ありません。HashMapやHashSetの違いについては、java.utilのCollection, Set, Map, ListあたりのAPIドキュメントを読むとすんなり理解されるのではないかと思います。これらは性能の違いではなくて、明確に機能の違いがあります。
Hashtable(同期化されるHashMap)やVector(同期化されるArrayList)は、昔のAPIの名残なので一切使う必要がなかったりします。同期化したい場合には、Collectionsクラスのsynchronized...メソッドで同期化するラッパオブジェクトを作成することができます。
No.4
- 回答日時:
さっきの回答に補足します。
もし、航空管制英語を abstract として実装しようとすると、
abstract class 地球人{
abstract 航空管制英語の定義
}
class 日本人 extends 地球人{
航空管制英語の実装(1);
}
class ドイツ人 extends 地球人{
航空管制英語の実装(2);
}
というようなことになるでしょう。ここで、航空管制英語の実装(1)と(2)の間にどの
程度の違いがあるのかが問題です。
(1)と(2)の大部分が同じで一部が違うだけならば、それは 地球人 クラスに持っていって、
(1)(2)では必要なところだけをオーバーライドするべきです。このとき、地球人クラスでは abstract
になるのはごく一部のメソッドだけのはずです。
逆に、(1)と(2)の実装の大部分が違う、あるいはまったく違う(そのため、地球人クラスでは
ほとんどを abstract にせざるを得ない)のであれば、それは日本人とドイツ人が同じ親(地球人)を
継承していること自体が間違っている可能性があります。その場合は、「航空管制英語」を interface
にして切り出した上で、日本人とドイツ人を別なクラスとして設計し、それぞれで implement すること
を考えるべきですね。
この回答への補足
実際に例を用いて説明して下さって、ありがとうございます。
航空管制英語の定義をabstractにするか、それとも
interfaceにするかですが、実際にプログラムを書く上
で、そのような事はいつ決定するのでしょうか?もちろ
ん上流工程で、航空管制英語を実装するクラスを決定し
てからだとは思うのですが、プログラムを書き始めてか
ら、そのような変更はしてもよろしいのでしょうか?
感覚的に、interfaceを使ってまずは航空管制英語の定
義をし、abstractを使って(地球人クラスの中で)航空
管制英語の実装を出来るだけし、後は(日本人クラスな
りドイツ人クラスなりで)残りの実装を試みたほうが、
柔軟性があると考えてよろしいでしょうか?
>本質的には interface と abstract
は同列に対比されるような概念ではありません
この事について、もう少し説明して頂けますでしょう
か。よろしくお願いします。
No.3
- 回答日時:
あなたは航空管制官です。
航空管制の共通語は英語です。いま、東から日本人がパイロットのJ111便がやってきました。英語で航空
管制をして、無事着陸させました。
次に、西からドイツ人がパイロットのG13便がやってきました。英語で管制
をして、無事着陸させました。
次に、宇宙から水星人がパイロットのM777便がやってきました。英語で管制
をして、無事着陸させました。
・・・・このようなケースを想定すると、次のようなクラス/インタフェースの
構造になります。
interface 航空管制英語 {
航空管制英語のインターフェイスの定義
}
abstract class 地球人 implements 航空管制英語 {
地球人に共通の記述;
航空管制英語の実装(A);
}
class 日本人 extends 地球人 { 日本人に固有の記述; }
class ドイツ人 extends 地球人 { ドイツ人に固有の記述; }
class 水星人 implements 航空管制英語{
水星人の記述
航空管制英語の実装(B);
}
class 航空管制官{
航空管制英語を話せる相手に対して航空管制を行うプログラム;
}
地球人と水星人にはまったくなんの関係もありませんが、どちらも航空管制官と
お話ができます。なぜなら、どちらも航空管制英語を身につけている(implements)
からです。
それに対して、日本人は生まれながらにして(extends) 地球人です。これらの
違いがイメージつきますか?
まあ要するに、全然別なクラス(地球人と水星人)を、共通のやり方(航空
管制英語)でコントロールしたい場合は、その「やり方」を interface にして、
それぞれのクラスに実装させるといいわけです。
それに対して、同じ種類のクラス(日本人とドイツ人)を、共通のやり方(航空
管制英語)でコントロールしたい場合は、その「やり方」を、上位のクラスに実装
しておくと、一箇所に書けばすむわけです。その「上位のクラス」がたまたま
abstract であることはあるでしょうけれど、本質的には interface と abstract
は同列に対比されるような概念ではありません。
たとえば、上の例で言うと、「地球人」は別に abstract でなくても何の問題
もありませんから。
No.2
- 回答日時:
HashtableとHashMapは、Hashtableが同期型なのに対してHashMapは非同期です。
機能的には大差ありません。(両クラスのAPIリファレンスにも書かれていたと思うので読んでみて下さい。)私は素直にそれに従って、マルチスレッドでインスタンス共有されることがなければ性能を考えてHashMapを使う様にしています。(私の場合ほとんどこれに該当するのでHashtableはあまり使いません)
HashTreeって、、、スミマセン知らないです。^^;(J2SEじゃないですよね)
interfaceとabstractの使い分けですが、個人的な感覚では、サーバコンテナの様な大きなサービスプログラムがユーザプログラムに断片的/制限的に機能を公開するのにはinterfaceが向いていると思います。JDBC-APIやServlet-APIでセッションを司る機能が殆どinterfaceな意味を考えて、最近そう悟りました。
interfaceを幾つも持つクラスは、それぞれのinterfaceを通して違った顔をユーザプログラムにサービスしながらも、内部的にはひとつのインスタンス上でリソースを統合管理する、なんてのが美しいのでは。そう考えるとinterfaceという名称がとても納得出来るものに感じられました。
対してabstractは、クラスのテンプレートだと解釈しています。
この回答への補足
誠に申し訳ありませんが、同期型と非同期方の違いとは
何でしょうか?
>HashTreeって、、、スミマセン知らないです。^^;(J2SEじゃないですよね
すいませんでした。HashSetの間違いです。それぞれ使
用しているinterfaceが違うというだけで、性能の違い
というのがピンときません…。
>abstractは、クラスのテンプレートだと解釈しています
interfaceもクラスのテンプレートのように見えるので
すが、私だけでしょうか…?
No.1
- 回答日時:
abstractはクラスですから、多重継承ができません。
これに対してinterfaceの場合複数実装することができます。
× class A extends B, C {...}
○ class A implements B, C {...}
○ class A extends B implements C, D {...}
したがって、すでに他のクラスから継承されている可能性があるクラスに対して、ある性質を追加しよう、というときにはinterfaceの方が向いていることになります。
一方、interfaceに定義されているメソッドはすべてabstractメソッドであるのに対して、abstractクラスに定義されているメソッドはabstractでないメソッド(すなわち実装されたメソッド)を含めることができます。
○
abstract class X{
public void baa() {...};
}
×
interface X{
public void baa() {...};
}
○
interface X{
public void baa();// interfaceでは暗黙のうちにabstractメソッドとなる
}
ということで、すでに実装されたメソッドを用意しておきたい場合はabstractクラスを使うと便利です。
この回答への補足
合っているかどうか分かりませんが…、
例えば”人間”というクラスで視覚クラス、聴覚クラ
ス、等々を実装したい場合、Javaでは多重継承が出来な
いため、視覚クラス、聴覚クラス、等々をinterfaceで
宣言することによって、これらの定義を人間クラスで使
用することが出来る、という考えでよろしいのでしょう
か。言ってみれば、多重継承をするためには、
interfaceを使うというような…?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- 邦楽 ジブリ公式ツイートの曲「いつも何度でも」のBGMで 1 2022/09/27 03:52
- Android tar.ファイルのインストールについて知りたいです 2 2022/07/23 15:34
- DIY・エクステリア テーブルソーとスライド丸のこの使い分けについて 4 2022/04/11 19:06
- 中古パソコン USBキーボードを外すと、起動できなくなる 2 2023/03/25 14:57
- ネットスーパー ファミペイ翌月払いについて 1 2022/09/07 21:06
- 日本語 認識と云う言葉と意識と云う言葉はいつの頃から? 3 2023/05/13 09:37
- その他(悩み相談・人生相談) アニメや俳優のグッズの収納方法について 1 2022/07/27 18:52
- 掃除・片付け アニメや俳優のグッズの収納方法について 2 2022/07/31 11:54
- ニコニコ動画 動画内のBGMについて 2 2022/10/14 09:57
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Class.forName("org.postgresql...
-
ゲッターを使わないで変数にア...
-
JTextFieldの入力制限
-
Javaでのジェネリクス型パラメ...
-
「IOException は対応する try ...
-
Javaで下線
-
C# 「データが失なわれる可能性...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
VB.NETでフォーム上にExcelのよ...
-
VBA コピーが出来ません…!
-
インスタンス参照でアクセスで...
-
配列の重複する値とその個数を...
-
配列のメソッド
-
コマンドプロンプト実行後に画...
-
コンボボックスのマウスホイー...
-
EXCEL VBAにて動的にCheckBOXを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
(vba)他のアプリケーションの右...
-
C# 「データが失なわれる可能性...
-
【C#】クラスのコンストラクタ...
-
「継承されたメソッドの可視性...
-
メソッドの引数にクラス名を渡す
-
JTextFieldの入力制限
-
ASP.NETでの共通コードの書き方...
-
「ラッパークラス」の存在意義...
-
interface,extend,implementの...
-
オーバーライドとラッパーの違い
-
抽象クラスをJUNITでテストする...
-
c++でのヘッダーファイルの循環...
-
C#からDLLを呼びたいのですが・...
-
vb.net 自作プロパティの削除に...
-
ファイルパスが取得出来ない(P...
-
委譲って何ですか?
-
c# この高速化の方法あり?
-
Excel vbaのプログラムでガンマ...
-
【C#】抽象クラスでコンパイル...
-
【設計思想の質問】staticメソ...
おすすめ情報