ベストアンサー 【Java】実装パターンの使い分け 2013/12/16 07:07 質問です。 (1)継承とコンポジションをどんな基準で使い分けていますか? (2)インターフェースと抽象クラスをどんな基準で使い分けていますか? 宜しくお願い致します。 . みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー askaaska ベストアンサー率35% (1455/4149) 2013/12/16 10:54 回答No.1 継承とコンポジションの大きな違いは2点 ・継承は1つしかできないけどコンポジションは2つ以上できる ・継承は継承元が変化すると影響を受けてしまう 一番の問題は2つ目の影響を受けるってことね 影響を受けたいか受けたくないかで決めればいいと思うわ もちろん2つ以上継承したい場合はコンポジションを採るしかないんだけど インターフェースと抽象クラス そもそも別ものだと思うんだけど 抽象クラスは複数のクラスをなんとなくまとめたもの とにかくいろんなところでメソッドとか振る舞いとかを共通化したいーって場合は インターフェースを作ればいいと思うの SerializableとかClonnableとかListとかがいい例と思うわ 例を挙げると、自動車や自転車、電車は抽象クラスだけど 運転する、とかブレーキを踏むとかはインターフェースなのよね 質問者 お礼 2013/12/16 22:49 ありがとうございます。 すみません、 前提に不備がありました。。 ◆継承とコンポジションについて 2個のクラスのメソッドを使いたいときは、当然コンポジションだと思いますが、 1個のクラスについての場合についてのことをお訊きしようとしておりました。 自分は、 親クラスと同じ振舞いをするメソッドが多いなら、 全メソッド分、委譲先に投げるだけの無駄な「エージェント役」をさせるのはナンセンスなので、 継承した方がよいのかなと思います。 100個のメソッドのうち、多様化対象が3メソッドだけなら、 その3メソッドだけオーバーライドするのが良いのかなと考えています。 作ったクラスを、さらに他のクラスから、利用するときのため、 インターフェースを残さなければならないとき (他のクラスから、型を意識させることなく呼びたい場合)などは、 特に継承を使った方が良いと考えます。 ◆インターフェースと抽象クラスについて 前提として、これも1つのインターフェースの場合です。 (クラスだと多重継承(クラスAをクラスBの両方を継承してクラスCを定義する)ができないため、 複数のインタフェースであれば、多重実装をするためインタフェースを使う場合については選択肢はない。) メソッドだけの話であれば、 「抽象的二輪車クラス」における「前進させる」「方向転換する」と、 「二輪車用インタフェース」としてまとめた「前進させる」「方向転換する」の集合は、 等価に感じます。 「抽象クラスは複数のクラスをなんとなくまとめたもの」とのことですが、 抽象クラスは、複数のクラスをまとめたものなのですか? 「抽象的二輪車クラス」を、 オートバイとしてインプリメントするとき、 「前進させる」は、「アクセルを踏む」として実装して、 自転車としてインプリメントするとき、 「前進させる」は、「ペダルを漕ぐ」として実装する認識です。 . 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発Java 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
ありがとうございます。 すみません、 前提に不備がありました。。 ◆継承とコンポジションについて 2個のクラスのメソッドを使いたいときは、当然コンポジションだと思いますが、 1個のクラスについての場合についてのことをお訊きしようとしておりました。 自分は、 親クラスと同じ振舞いをするメソッドが多いなら、 全メソッド分、委譲先に投げるだけの無駄な「エージェント役」をさせるのはナンセンスなので、 継承した方がよいのかなと思います。 100個のメソッドのうち、多様化対象が3メソッドだけなら、 その3メソッドだけオーバーライドするのが良いのかなと考えています。 作ったクラスを、さらに他のクラスから、利用するときのため、 インターフェースを残さなければならないとき (他のクラスから、型を意識させることなく呼びたい場合)などは、 特に継承を使った方が良いと考えます。 ◆インターフェースと抽象クラスについて 前提として、これも1つのインターフェースの場合です。 (クラスだと多重継承(クラスAをクラスBの両方を継承してクラスCを定義する)ができないため、 複数のインタフェースであれば、多重実装をするためインタフェースを使う場合については選択肢はない。) メソッドだけの話であれば、 「抽象的二輪車クラス」における「前進させる」「方向転換する」と、 「二輪車用インタフェース」としてまとめた「前進させる」「方向転換する」の集合は、 等価に感じます。 「抽象クラスは複数のクラスをなんとなくまとめたもの」とのことですが、 抽象クラスは、複数のクラスをまとめたものなのですか? 「抽象的二輪車クラス」を、 オートバイとしてインプリメントするとき、 「前進させる」は、「アクセルを踏む」として実装して、 自転車としてインプリメントするとき、 「前進させる」は、「ペダルを漕ぐ」として実装する認識です。 .