• ベストアンサー

委譲って何ですか?

最近、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

  • 委譲と委任の違いを教えてください

    市長の権限に属する事務を課長に委任するといいます。事務の委譲とはいわないのでしょうか。選挙などの投票は委任するといいます。どういうときに委譲なのか、または委任なのか。違いをご教示下さい。  

  • CGIで他のページに処理を委譲

    Perl初心者です。 CGIモジュールを用いてWEBサイトを制作しています。 特定の条件に応じて他のページに処理を委譲したいのですが、 どのようなやり方が一般的なのかを教えて頂きたいです。 requireを使えばそれらしいことが出来ますが、 他に何かやり方がありますでしょうか。 フレームワークなどは用いていません。

    • ベストアンサー
    • Perl
  • JComponentを継承して処理をJButtonに委譲

    例えば、JButtonのメソッドの仕様を  int getText();  void setText( int value ); と、変更したい場合を考えます。 このとき、 public IntegerButton extends JComponent {    JButton delegator;    public IntegerButton(int value, Icon icon) {   delegator = new JButton(Integer.toString(value), icon);   setLayout(new BorderLayout());   add(delegator);  }    public int getText() {   return Integer.parseInt(delegator.getText());  }  public void setText(int value) {   delegator.setText(Integer.toString(value));  }      //委譲メソッド  public void addMouseListener(MouseListener ml) {   delegator.addMouseListener(ml);  }  public void removeMouseListener(MouseListener ml) {   delegator.removeMouseListener(ml);  }     } という感じで書くことになると思うのですが、疑問なのは JComponent,AbstractButton等継承しているクラスの中の、 どのメソッドを転送する必要があるのかが不明なことです。 addMouseListener(MouseListener ml)は委譲する必要があると 思うのですが、逆にpaint(Graphics g)を委譲すると 上手くいかなくなります。 また、requestFocusInWindow()に関しては、  public boolean requestFocusInWindow() {   super.requestFocusInWindow();   return delegator.requestFocusInWindow();  } とする必要があるのかもしれません。 この正攻法が載っているようなサイト、本や資料等を ご存知でしたらご教示ください。

  • 抑圧委譲を止める

    「上見て暮らすな、下見て暮らせ」などという言葉がありますが・・・・・。 ここでは労働問題を取り上げてみましたが、別の事柄にも当てはまります。 個人や数人の友人などで「上」に難癖をつけるのは不可能なのでしょうか。残業代を取り返す時に、確かに情報集めや法律知識・弁護士・労基署に持ち込むなどなど手続きが大変そうだ。そうではなしに我慢に我慢してから労基署などに行かなくても、日常的に社員全員が持っている「意見」や「空気」の形として、使用者側に圧力を掛けられないのでしょうか。理想ですか?それは。(5時だ、帰るぞ、社長文句あるか。というフレーズを聞いた事がある) 今起こっているのは、組合を作るような向きではなしに、「正社員なら派遣をこき下ろして楽しむ」「派遣なら休みにバイクで無謀に走り回って憂さ晴らしする」「課長なら上から絞めつけられているから、仕事を部下に放り投げて悦に浸る」ような、上に向いていかない運動である気がします。 上に向いたかの様に思われる事もあるが違う、「大手マスコミの一社員が痴漢した」というような話に過ぎず、大手マスコミの構造云々の話にはもっていかない。勿論、新しいタイプのネットメディアで「旧来からのエスタブリッシュメント」にメスを入れる論者も現れている。が、日本の多数派の庶民の問題としては「上」に向かう運動は低調ではないか。 と、問題意識?のようなものを少し長めにまとめてみました。アンケートは主に3つです。 0.上の意見「への意見」があれば・・ 1・抑圧の委譲は日本で特に酷いのか、どこの国でも日本と同程度あるのか。 2・抑圧の委譲は止められるか、緩和できる可能性があるのか。 3.もし可能性がある(ない)としたらその手段や理由は何か。

  • 投資顧問会社に経営権委譲とは?

    ある会社への就職をすすめられています。 その会社の企業概要を見ると、最近、「投資顧問会社へ経営権委譲」とあります。 これはいったいどういう意味なのでしょうか? 経営状態が悪いということでしょうか。 ちなみにNASDAQへの上場も同時に廃止しているようです。 どなたか教えてください。

  • 今日(19.5.28)放送「ズームイン」税源委譲の話

    本日5月28日のズームインで、税源委譲の話をしていて 住宅ローン減税対象の人は市町村に毎年申告しなくてはならない、 みたいな事を言っていましたが、ちょうど聞き逃してしまったので 意味がわかりませんでした。 申し訳ありませんが、その部分をご覧になって、説明できる方、お願いいたします。 ちなみに私はH15に住宅新築し、毎年年末調整で勝手に税金が還付されている状態です。

  • サブドメインの委譲(転送)

    以下のサブドメインの管理をns1.example.comからns1.answer.comへ委譲(転送)するにはどのような記述をゾーンファイル(example.com.zone)すればよろしいでしょうか? やりたいことは以下のサブドメインの管理を別のネームサーバー(ドメイン)で管理したいということです。 ※このドメインを管理しているネームサーバーはns1.example.comとする。 pc.example.com a.pc.example.com b.pc.example.com c.pc.example.com ご存知の方、宜しくお願いします。 (そもそもできるのだろうか。。)

  • テイルズオブリバースについて

    テイルズオブリバースで最強の武具の作り方教えて下さい!色々なWebページで確認するとエンハンスしまくって、継承させればいいみたいな事が書いてありますが、その手順がいまいち理解できません!(>_<)どなたか分かる方、噛み砕いて教えて頂けますでしょうか?あと分かりやすいWebページをご存知でしたらそちらも教えて頂けたら嬉しいです♪宜しくお願い致します~

  • DNSの権限委譲先について

    よろしくお願いします。 現在、あるインターネットプロバイダからクラスCでグローバルIPを取得して社内でメールサーバーを運営しているものです。現在は、社内にあるDNSサーバーにて逆引きを行いスパムメール対策を行っているのですが、DNSのアウトソースを検討しています。 そこで質問なのですが、 ・(プロバイダによって違うとは思いますが、)逆引きDNSの権限委譲先(現状は社内自営DNSサーバー)は、自社内でなく、現行プロバイダ会社とも違う、他社にしても構わないのでしょうか。 ・もし、上記の質問が可能であれば、具体的に安価なDNSサーバーの運営会社を教えて頂けますでしょうか。(現在、ホームページのドメインと、上記メールのドメインとが別の為、ホームページ運営会社(ホームページのドメインのDNS解決はこの会社にお願いしている)以外で、DNSのみの運営をお願いできるところを探しています。 以上、宜しくお願い致します。 不明な点がありましたらご質問ください。

  • フランスの貴族と王家

    フランスの貴族と王家には、具体的にどんな違いがあるんでしょうか?(フランス革命のあった時期) 暮らしぶり、位の継承の仕方などに違いがあったのでしょうか。 第三身分と直に関わることもあったのでしょうか。 分かりにくい質問ですみません。

専門家に質問してみよう