C++ Academy · レッスン

継承とコンポジションのトレードオフ

継承とコンポジションを比較し、設計に適した手法を選びます。

レッスン 4/414 ステップ

「継承とコンポジションのトレードオフ」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 単一継承と多重継承
  2. 仮想関数とvtable
  3. 抽象クラスと純粋仮想メソッド
  4. 継承とコンポジションのトレードオフ
← C++ Academyに戻る