-1

疑いの余地がない場合もありますが、非常に難しい決断になる場合もあります。いくつかの例を示しましょう。

継承:

public class Employee{
    public void goToWork(){
        //...
    }
}
public class Lawyer extends Employee{
    //private Employee body;
    /*public void goToWork(){
        body.goToWork(); // Does that make any sense?
    }*/
}

委任:

public class Lights{
    public void turnOn(){
        //...
    }
}
public class Car{ //public class Car extends Lights? Nice car then...
    private Lights light;
    public void turnOnLights(){
        light.turnOn();
    }
}

どれ?

public class Field{
public void grow(Seeds s){
        //...
    }
}
public class Plantation{ //extends Field{ makes sense too
    private Field field;
    private Worker[] workers;
    private Vehicle[] tractors;

    public void grow(Seeds s){
        //...
        field.grow(s);
    }
}

では、継承と委任のどちらも受け入れられ、それぞれに長所と短所がある場合に、どちらかを選択するのに役立つヒントはありますか? 選択はランダムで、完全にプログラマーの気分に基づいていますか?

4

3 に答える 3

2

Field(a) プランテーションには単なる畑以外のものがあり、(b) プランテーションには複数の畑がある可能性が高いため、プランテーションは拡張されません。

この場合畑には独自のトラクターがないため、プランテーションは畑ではありませ

たとえば、スケジューリングの目的で、田畑を一時的にトラクターに関連付けることができますが、そのトラクターは、包括的なコンテナーであるプランテーションに属します。

一般に、継承は範囲がかなり限定されており、行動特性がかなり正確に共有されている場合にのみ機能します。この場合、特性は本質的に共有されておらず、スケジューリングはまったく異なるメカニズムによって処理されます。

于 2013-10-23T21:03:52.117 に答える
1

それらにはさまざまな長所と短所があります。たとえば、継承できるものは 1 つだけです。継承 ( public class Plantation extends Field) を決定した後で、本当にPlantation複数Fieldの が必要であると決定した場合はどうなるでしょうか。Plantations複数が 1 つの を共有できると判断した場合はどうなるFieldでしょうか。

構成 (または委任) は通常、より将来的に安全ですが、多くの場合、継承は非常に便利であるか、技術的に正しい場合があります。「X は Y を継承する」は「X は Y である」ことを意味するため、そのステートメントが技術的に正しい場合 (たとえば、「正方形は長方形である」) に役立ちます。

最終的には、コードを実装する人に委ねられる設計上の決定です。ここに「正しい」答えはありません。

于 2013-10-23T21:03:44.547 に答える
0

それは、あなたがすでに知っている意思決定に大きく依存します。それは、「子は親としてすべての (ほぼすべての) 機能を持っていて、必要としているか?」ということです。

委任と比較すると、「オブジェクトは、その本体の中に別のオブジェクトを含んでいますか?」

このように考えることもできます。畑のリストがある場合、このリストに畑とプランテーションを含めることは理にかなっていますか? そうでない場合は、延長できません。

この例について - 私は委任を好むと思います.なぜなら、プランテーションは単に拡張されたフィールドではなく、フィールドと人などを使用して利益を上げるものだからです.

少し異なる動作をする同じまたは類似のメソッド (grow など) が必要な場合は、両方のクラスが実装するインターフェイスが必要です。

于 2013-10-23T21:07:40.647 に答える