第10章 オブジェクト指向構文 / 第4回 模擬試験

PHPの委譲(コンポジション)に関する次の記述のうち、正しいものはどれか。

委譲とは、あるオブジェクトが他のオブジェクトにメソッド呼び出しを代行させる設計手法である。 正解
委譲は継承と全く同じ意味を持つ用語である。
委譲を使うクラス設計では、`extends`キーワードが必須である。
委譲はPHPの構文としてサポートされておらず、実現不可能である。
解説
委譲(デリゲーション)とは、あるオブジェクトが自分の内部に別のオブジェクトを保持し、特定の処理をそのオブジェクトのメソッド呼び出しに「代行させる」設計手法です。継承(`extends`によるis-a関係)とは異なり、「〜を持っている(has-a関係)」という関係を表すコンポジション(合成)の一種です。 他の選択肢が誤りである理由は次の通りです。 ・委譲は継承と異なる概念です。継承は親クラスの実装をそのまま引き継ぐ仕組みですが、委譲は別オブジェクトへの処理の委任です。 ・委譲を実現するのに`extends`キーワードは必須ではありません。むしろ`extends`を使わず、プロパティとして他のオブジェクトを保持する形で実現するのが一般的です。 ・委譲はPHPの言語機能というより設計パターンであり、通常のメソッド呼び出しの組み合わせだけで実現できます。「実現不可能」というのは誤りです。 例: ``` class Logger { public function log(string $msg): void { echo "[LOG] {$msg}"; } } class OrderService { public function __construct(private Logger $logger) {} public function placeOrder(): void { $this->logger->log('注文を受け付けました'); // Loggerに処理を委譲 } } ``` (参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.3.6節 委譲 p.506〜508)

あわせて読みたい解説記事