ウィキペディアのデコレータのデザイン パターンと、このサイトのコード例を読みました。
従来の継承は「is-a」パターンに従いますが、デコレータは「has-a」パターンに従います。そして、デコレータの呼び出し規約は、「スキン」より「スキン」のように見えます..「コア」よりも。例えば
I* anXYZ = new Z( new Y( new X( new A ) ) );
上記のコード例のリンクに示されているように。
しかし、私が理解していないいくつかの質問がまだあります。
「実行時に特定のオブジェクトの機能を拡張 (装飾) するためにデコレータ パターンを使用できます」という wiki の意味は何ですか? 「new ...(new... (new...))」は実行時の呼び出しであり、適切ですが、「AwithXYZ anXYZ;」です。コンパイル時の継承であり、悪いですか?
コード例のリンクから、両方の実装でクラス定義の数がほぼ同じであることがわかります。「Head first design patterns」のような他のデザイン パターンの本を思い出します。彼らは例としてスターバズコーヒーを使用し、従来の継承は「クラスの爆発」を引き起こすと言います。コーヒーの組み合わせごとに、そのクラスを考え出すからです。
でも、この場合デコレータも同じじゃないですか。デコレータ クラスが任意の抽象クラスを取り、それを装飾できる場合、爆発を防ぐことができると思いますが、コード例から、正確な数のクラス定義が得られます...
誰か説明してくれませんか?