• ベストアンサー

委譲って何ですか?

最近、Webを見ていて「安易な継承を使うよりも委譲を使うほうが良い」 見たいな事が書いてあったのですが、 「委譲」とは具体的にどのようなものでしょうか? 「継承」との違いは? ご存知のかた、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

「委譲」とは、他のオブジェクトに処理(責任)を譲ることをいいます。 多分、ソースを見比べると雰囲気が分かります。 クラス C のメソッド print() を、頭に「★」を付加するように拡張する例です。 class C { public: void print(char* str) { cout << str << endl; } }; //継承で機能拡張 class C1 : public C { public: void print(char* str) { cout << "★"; C::print(str); } }; //委譲で機能拡張 class C2 { private: C* c_; public: C2() { c_ = new C(); } void print(char* str) { cout << "★"; c_->print(str); } }

yosizo
質問者

お礼

大変解かり易い例をあげていただき、ありがとうございます。 なるほど、特別な機能という訳ではないのですね。(^^; ・・・ただ、やってることは理解できたのですが、 なぜ継承よりも委譲の方が良いとされるのでしょうか? やはり、ソースの見通しが良いとかそういう理由なのでしょうか。 追加の質問で申し訳ありません。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> なぜ継承よりも委譲の方が良いとされるのでしょうか? オブジェクト指向というのは、要求される「機能」を実装してゆくのではなく、対象と している問題領域を *素直に* モデル化することで、それが要求される機能の変更に 対して強い(変更箇所が局所化されている)のが利点だ、というのは本で読んだとおりです。 その「素直なモデル化」に関係することです。 派生というのは、is-a の関係にある関連です。 継承元→継承先と見ると、それは「具体化」になっているべきで、逆に、継承先→継承元と 見ると、「抽象化」になっているべきです。概念として包含関係になっているように。 例えば、動物→哺乳類→猿、というふうに概念が具体的になってゆきます。 猿から派生させるとしたら、猿を更に具体化するような、ゴリラだとかチンパンジーは OK なんですけど、求める振る舞い(機能と言っても良い)が、殆ど同じだからといって 猿から犬を派生させちゃいけないんです。 これは「安直な派生」とみなされます。 ただ、現実問題として、同じ振る舞いをあちこちに記述するのは、オブジェクト指向が 求めるものからいっても、ふさわしいことではないですから、そういった場合の解決 方法として「委譲」の方が良いのではないか、ということです。 さっきの犬の話に戻ると、具体化のレベルを合せる意味では、犬は哺乳類から派生させる べきで、実装を共有させるために、幾つかのメソッドを猿に委譲する方が、オブジェクト としては素直なモデルです。 安直な派生のもうひとつのケースとして、多重継承があります。 新しい機能を実装するクラスを考えたときに、あの機能も流用したい、この機能も 流用したい、だから、いろんなクラスから多重継承してしまう、というケース。 これも「機能の実装」の側面で考えているわけですから、派生は概念の具体化だ、と 言うことに反します。 機能を流用したければ、そのオブジェクトを抱えておいて、必要な機能だけを委譲して 使う方が良い、と言われます。 # ん~、あまり上手な説明ではないですね (^^; # 補足は遠慮無くどうぞ。できる範囲で頑張ります。

yosizo
質問者

お礼

御礼が遅くなって申し訳ないです。 大変丁寧な解説をしていただき、ありがとうございました。

すると、全ての回答が全文表示されます。
noname#2787
noname#2787
回答No.2

委譲…譲り渡すこと 禅譲…徳のあるもの、有能な者に位を譲ること 禅譲?? 『安易な継承(世襲)でなく『禅譲』を使うほうが良い…』なら意味がわかりますが。 具体的にはどんな分野・場面で使われていたのでしょうか?(もしかして本物のプログラム用語なのでしたら、一笑にふしてください。←まったくの素人なので勘違いかもしれんです。)

yosizo
質問者

お礼

すみません、「委譲」は本物のプログラム用語です。 オブジェクト指向の分野で耳にしたもので質問しました。

すると、全ての回答が全文表示されます。

関連するQ&A