継承よりコンポジション
適する場合は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フィードバックを取得できます。ローカル設定は不要です。