継承とコンポジションのトレードオフ
継承とコンポジションを比較し、設計に適した手法を選びます。
「継承とコンポジションのトレードオフ」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
コードを再利用する 2 つの方法
別のクラスを継承するか、メンバーとしてコンポジションすることで、コードを再利用できます。どちらにも適した用途があります。
継承:「is-a」
派生クラスが基底クラスの本当の特殊な種類である場合に、継承を使用してください。
class Vehicle {};
class Car : public Vehicle {}; // a Car IS a Vehicle
class SportsCar : public Car {};コンポジション:「has-a」
関係が「has-a」または「uses-a」である場合に、コンポジションを使用してください。
class Engine {};
class Car {
Engine engine_; // a Car HAS an Engine
};結合度のトレードオフ
継承では強い結合が生まれ、派生クラスが基底クラスの内部実装に依存します。コンポジションではモジュールが独立し、変更しやすくなります。
柔軟性
コンポジションでは、コンポジションするオブジェクトを入れ替えて、ランタイムに動作を変更できます。継承では、動作がコンパイル時に固定されます。
class Logger {
std::unique_ptr<LogSink> sink_; // can swap implementations
public:
void setSink(std::unique_ptr<LogSink> s) { sink_ = std::move(s); }
};テスト
コンポジションしたオブジェクトは、テスト用のモックに置き換えられます。継承した基底クラスは、仮想関数やテンプレートがなければモック化が困難です。
脆弱な基底クラス問題
基底クラスの変更によって、多くの派生クラスが壊れる可能性があります。コンポジションでは、変更の影響をコンポジションするクラス内に閉じ込められます。
継承を選ぶ場合
次の場合は継承が適しています。
- 明確な「is-a」関係が存在する
- 基底インターフェースを通じたポリモーフィズムが必要である
- 基底クラスが継承を前提に明示的に設計されている
コンポジションを選ぶ場合
次の場合はコンポジションが適しています。
- 実装を入れ替える柔軟性が必要である
- 関係が「has-a」または「uses-a」である
- 低い結合度と容易なテストを実現したい
Strategy パターン
コンポジションとポリモーフィズムを組み合わせます。ホストクラスがコンポジションする strategy オブジェクトを、基底クラスのポインターで保持します。
class Sorter {
std::unique_ptr<SortStrategy> strategy_;
public:
void sort(std::vector<int>& v) { strategy_->execute(v); }
};ミックスインとポリシークラス
コンパイル時のカスタマイズには、テンプレート化したポリシークラスを使用します。これは型レベルのコンポジションであり、強力で、ランタイムオーバーヘッドがありません。
インターフェースとコンポジション
現代的な一般的パターンの 1 つは、インターフェース(抽象基底クラス)を定義し、それを実装する具象クラスをコンポジションする方法です。インターフェースには継承を、実装にはコンポジションを使用します。
理解度チェック
一般に、より柔軟で結合度が低くなるアプローチはどちらですか。
まとめ
継承は「is-a」を、コンポジションは「has-a」をモデル化します。コンポジションはより柔軟で結合度が低いため、コードの再利用にはこちらを優先してください。インターフェースを通じたポリモーフィズムには継承を使用し、多くの場合は実装にコンポジションを組み合わせます。
AI チューターと学ぶ C++ — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「継承とコンポジションのトレードオフ」レッスンは無料ですか?
はい。「継承とコンポジションのトレードオフ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「継承とコンポジションのトレードオフ」で何を学びますか?
継承とコンポジションを比較し、設計に適した手法を選びます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「継承とコンポジションのトレードオフ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 単一継承と多重継承
- 仮想関数とvtable
- 抽象クラスと純粋仮想メソッド
- 継承とコンポジションのトレードオフ