アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

ご存知のかた、教えてください。

A 回答 (3件)

「委譲」とは、他のオブジェクトに処理(責任)を譲ることをいいます。


多分、ソースを見比べると雰囲気が分かります。

クラス 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);
}
}
    • good
    • 0
この回答へのお礼

大変解かり易い例をあげていただき、ありがとうございます。
なるほど、特別な機能という訳ではないのですね。(^^;

・・・ただ、やってることは理解できたのですが、
なぜ継承よりも委譲の方が良いとされるのでしょうか?
やはり、ソースの見通しが良いとかそういう理由なのでしょうか。

追加の質問で申し訳ありません。

お礼日時:2001/12/08 01:08

委譲…譲り渡すこと


禅譲…徳のあるもの、有能な者に位を譲ること

禅譲??
『安易な継承(世襲)でなく『禅譲』を使うほうが良い…』なら意味がわかりますが。

具体的にはどんな分野・場面で使われていたのでしょうか?(もしかして本物のプログラム用語なのでしたら、一笑にふしてください。←まったくの素人なので勘違いかもしれんです。)
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/12/08 01:10

> なぜ継承よりも委譲の方が良いとされるのでしょうか?



オブジェクト指向というのは、要求される「機能」を実装してゆくのではなく、対象と
している問題領域を *素直に* モデル化することで、それが要求される機能の変更に
対して強い(変更箇所が局所化されている)のが利点だ、というのは本で読んだとおりです。

その「素直なモデル化」に関係することです。

派生というのは、is-a の関係にある関連です。

継承元→継承先と見ると、それは「具体化」になっているべきで、逆に、継承先→継承元と
見ると、「抽象化」になっているべきです。概念として包含関係になっているように。

例えば、動物→哺乳類→猿、というふうに概念が具体的になってゆきます。

猿から派生させるとしたら、猿を更に具体化するような、ゴリラだとかチンパンジーは
OK なんですけど、求める振る舞い(機能と言っても良い)が、殆ど同じだからといって
猿から犬を派生させちゃいけないんです。

これは「安直な派生」とみなされます。

ただ、現実問題として、同じ振る舞いをあちこちに記述するのは、オブジェクト指向が
求めるものからいっても、ふさわしいことではないですから、そういった場合の解決
方法として「委譲」の方が良いのではないか、ということです。

さっきの犬の話に戻ると、具体化のレベルを合せる意味では、犬は哺乳類から派生させる
べきで、実装を共有させるために、幾つかのメソッドを猿に委譲する方が、オブジェクト
としては素直なモデルです。


安直な派生のもうひとつのケースとして、多重継承があります。

新しい機能を実装するクラスを考えたときに、あの機能も流用したい、この機能も
流用したい、だから、いろんなクラスから多重継承してしまう、というケース。

これも「機能の実装」の側面で考えているわけですから、派生は概念の具体化だ、と
言うことに反します。

機能を流用したければ、そのオブジェクトを抱えておいて、必要な機能だけを委譲して
使う方が良い、と言われます。

# ん~、あまり上手な説明ではないですね (^^;
# 補足は遠慮無くどうぞ。できる範囲で頑張ります。
    • good
    • 3
この回答へのお礼

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

お礼日時:2001/12/11 18:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!