0Pricing
Dart Academy · レッスン

継承よりコンポジション

適する場合はhas-a設計を選ぶ

「継承よりコンポジション」はCoddyKit上の無料Dart Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDart Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Dart Academyコースには全4レッスンが含まれています。

再利用する2つの方法

振る舞いを継承する方法と、別のオブジェクトを保持する方法で再利用できます。後者はコンポジションと呼ばれます。

is-a と has-a

継承はis-aを表します。たとえば、Circle は Shape です。コンポジションはhas-aを表します。たとえば、Car は Engine を持ちます。

コンポジションされたクラス

コンポジションでは、ヘルパーをフィールドとして保持し、継承する代わりにそのヘルパーへ処理を委譲します。

class Car {
  final Engine engine = Engine();
}

振る舞いを委譲する

外側のクラスは、呼び出しを内部のオブジェクトに転送します。この委譲により、継承せずにロジックを再利用できます。

class Car {
  final engine = Engine();
  void start() => engine.ignite();
}

脆弱な基底クラスの問題

深い継承は壊れやすいものです。親クラスの変更によって、遠く離れたサブクラスが気づかないうちに壊れることがあります。これは脆弱な基底クラスと呼ばれる問題です。

実行時の柔軟性

コンポジションなら、内部のオブジェクトを好きなタイミングで交換できます。継承は一度決めると固定されますが、フィールドは変更できます。

class Car {
  Engine engine;
  Car(this.engine);
}

インターフェースと組み合わせる

コンポジションをインターフェースと組み合わせます。抽象的なEngine型に依存すれば、適合する任意のエンジンを自然に組み込めます。

abstract class Engine {
  void ignite();
}

テストしやすい

各部品が別々のオブジェクトになっているため、テストでは偽物のオブジェクトを渡せます。コンポジションによりモックを簡単かつ自然に利用できます。

var car = Car(FakeEngine());

不適切なものまで継承しない

サブクラスは、公開すべきでないメンバーまで含め、すべてのメンバーを継承します。コンポジションなら、委譲するものだけを共有できます。

それでも継承が適している場合

明確なis-a関係と共通のアイデンティティがある場合、継承は適切です。実際には has-a の関係である場合は、コンポジションを選びます。

実践的なルール

原則としてコンポジションを優先し、継承は慎重に使います。そうすると設計の結合度が下がり、後から変更しやすくなります。🧩

クイックチェック

コンポジションについての簡単な問題です。

まとめ

コンポジションは、他のオブジェクトを保持して処理を委譲することで has-a 関係を表します。柔軟でテストしやすく、継承は明確な is-a 関係に適しています。👍

よくある質問

「継承よりコンポジション」レッスンは無料ですか?

はい。「継承よりコンポジション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Dart Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Dart Academyコースには全4レッスンが含まれています。

「継承よりコンポジション」で何を学びますか?

適する場合はhas-a設計を選ぶ ブラウザで直接実行するハンズオンコードでDart Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Dart Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDart Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「継承よりコンポジション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDart Academyレッスンでコードを書いて実行できますか?

はい。すべてのDart Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. 抽象クラスと抽象メソッド
  2. 暗黙的インターフェースとimplements
  3. 共有型によるポリモーフィズム
  4. 継承よりコンポジション
← Dart Academyに戻る