- ベストアンサー
【Java】実装パターンの使い分け
質問です。 (1)継承とコンポジションをどんな基準で使い分けていますか? (2)インターフェースと抽象クラスをどんな基準で使い分けていますか? 宜しくお願い致します。 .
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
継承とコンポジションの大きな違いは2点 ・継承は1つしかできないけどコンポジションは2つ以上できる ・継承は継承元が変化すると影響を受けてしまう 一番の問題は2つ目の影響を受けるってことね 影響を受けたいか受けたくないかで決めればいいと思うわ もちろん2つ以上継承したい場合はコンポジションを採るしかないんだけど インターフェースと抽象クラス そもそも別ものだと思うんだけど 抽象クラスは複数のクラスをなんとなくまとめたもの とにかくいろんなところでメソッドとか振る舞いとかを共通化したいーって場合は インターフェースを作ればいいと思うの SerializableとかClonnableとかListとかがいい例と思うわ 例を挙げると、自動車や自転車、電車は抽象クラスだけど 運転する、とかブレーキを踏むとかはインターフェースなのよね
お礼
ありがとうございます。 すみません、 前提に不備がありました。。 ◆継承とコンポジションについて 2個のクラスのメソッドを使いたいときは、当然コンポジションだと思いますが、 1個のクラスについての場合についてのことをお訊きしようとしておりました。 自分は、 親クラスと同じ振舞いをするメソッドが多いなら、 全メソッド分、委譲先に投げるだけの無駄な「エージェント役」をさせるのはナンセンスなので、 継承した方がよいのかなと思います。 100個のメソッドのうち、多様化対象が3メソッドだけなら、 その3メソッドだけオーバーライドするのが良いのかなと考えています。 作ったクラスを、さらに他のクラスから、利用するときのため、 インターフェースを残さなければならないとき (他のクラスから、型を意識させることなく呼びたい場合)などは、 特に継承を使った方が良いと考えます。 ◆インターフェースと抽象クラスについて 前提として、これも1つのインターフェースの場合です。 (クラスだと多重継承(クラスAをクラスBの両方を継承してクラスCを定義する)ができないため、 複数のインタフェースであれば、多重実装をするためインタフェースを使う場合については選択肢はない。) メソッドだけの話であれば、 「抽象的二輪車クラス」における「前進させる」「方向転換する」と、 「二輪車用インタフェース」としてまとめた「前進させる」「方向転換する」の集合は、 等価に感じます。 「抽象クラスは複数のクラスをなんとなくまとめたもの」とのことですが、 抽象クラスは、複数のクラスをまとめたものなのですか? 「抽象的二輪車クラス」を、 オートバイとしてインプリメントするとき、 「前進させる」は、「アクセルを踏む」として実装して、 自転車としてインプリメントするとき、 「前進させる」は、「ペダルを漕ぐ」として実装する認識です。 .