4

親クラスがあるとしましょう

class parent { }

.....

この親には3つのサブクラスがあります

class child1 { }

class child2 { }

class child3 { }

これらの子クラスには、次のようなさらに小さな部分があります。

class child1subpar1 { }

class child1subpar2 {

       public function foo() {
          echo "hi";
       }

}

class child2subpar1 { }

class child2subpar2 { }

さて、この全体を次のように要約する方法

class child1 extends child1subpar1, child1subpar2 { }
class child2 extends child2subpar1, childsubpar1 { }

class parent extends child1,child2,child3 { }

継承されたクラスのメソッドを実行して、次のようなことをする必要があります

$objparent=新しい親; $ objparent-> foo();

4

6 に答える 6

2

いいえ。ただし、多重継承は一般的に悪い習慣と見なされます。代わりに構成を優先する必要があるため、クラス内で継承したいクラスのインスタンスを使用するだけです。

そして今、私があなたの質問をもう一度調べるとき、それは継承の問題でさえありません、あなたは構成を使うべきです。たぶん、あなたがそのクラスに期待することをより詳細に提供した場合、私たちはより正確に答えるべきです。

アップデート:

使用したいこれらのクラスのメソッドごとに1つのメソッドを作成する必要があります。これはFacadeデザインパターンと呼ばれます。または、次のような内部オブジェクトのメソッドを呼び出すことができることに気付いていない可能性があります。

$parent->subObject->subSubObject->wantedMethod();

ファサードパターン:

http://en.wikipedia.org/wiki/Facade_pattern

あなたの場合、ファサードは、1つのクラスを作成し、使用するすべてのメソッドを定義し、そのメソッド内で任意の内部インスタンスの任意のメソッドを呼び出すことに他なりません。しかし、インスタンスとメソッドを階層的に呼び出す代わりに、これから得られるメリットは実際にはわかりません。

于 2010-05-12T01:21:33.553 に答える
2

あなたはOOPについて本当に混乱しているようです。

親クラスはその子供たちの意識を持っていません。子クラスを実行する場合は、そのインスタンスを作成する必要があります。

PHP(およびJavaのような他の多くの一般的な言語)では、多重継承も許可されていません。

集約を検討する価値があるかもしれません-より小さなサブクラスを子またはイベントの親クラスに渡します。また、複数のインターフェースの実装を使用して、サブクラスに必要なメソッドのセットを強制することもできます。

于 2010-05-12T01:22:34.687 に答える
1

他の人に+1。あなたは本当にそれを後方に持っています。子供は常に両親を拡張します。

しかし、PHPの多重継承のように機能するものもあります。それはデコレータパターンです。私はここの私のブログにそれについての記事を書きました。

于 2010-05-12T03:55:39.747 に答える
1

あなたがしていることは本当に後方です。継承は、コードを重複させることなく、オブジェクトに共通の共有機能を付与するために使用されます。継承は親から子に行き、親ができることはすべて、子も同様に行うことができますが、それ以上のことを行う可能性があります(親の機能を拡張します)。

class Parent {

    function everyoneCanDoThis() { }

}


class Child extends Parent {

    // I can implicitly use the everyoneCanDoThis() function

    function onlyChildrenCanDoThis() { }

}

これはトップダウン構造であるため、親は特定の子に依存しないでください。親は子の関数を実行または呼び出しません。子の関数を呼び出すのはあなただけですが、これらの関数は親クラスから継承される場合があります。

すべてのオブジェクトで実行できるようにするすべてのものをParentクラスに配置する必要があります。特定のオブジェクトにのみ関連する特定の機能は、子に組み込まれます。

多重継承は、正当な理由から、PHPでは不可能なワームの別の缶です。継承の基本を理解したら、ここの他の場所で提案されているように、構成に戻ってください。:)


構成とは、いくつかのオブジェクトを取得し、それらへの参照を別のオブジェクトに保持することを意味します。これらの各オブジェクトはParentクラスから継承する場合と継承しない場合があり、それらは依然として個別のオブジェクトであるため、継承とは何の関係もありません。

class ComposedObject {

    private $part1 = null;
    private $part2 = null;

    public function __constructor() {
        $this->part1 = new Part1();
        $this->part2 = new Part2();
    }

    public function doTask() {
        return $this->part1->doSomeTask();
    }

    public function doOtherTask() {
        return $this->part2->doSomeOtherTask();
    }

}

ComposedObjectには、継承されているかどうかに関係なく、それ自体には機能がありません。しかし、それはそれぞれがいくつかの機能を持っている他の2つのオブジェクトを保持しています。「パーツ」の機能は直接公開されるため、のように呼び出され$composedObject->part1->doSomeTask()ます。例のようにカプセル化されるため、のように呼び出され$composedObject->doTask()て内部的に委任されます。または、トリックを使用して、__call()呼び出された関数を自動的に委任することもできます。構成されたオブジェクトをその「パーツ」の1つに追加します。ただし、これには多重継承と同じ問題があります。2つの「パーツ」の両方に同じ名前のメソッドが含まれている場合、どちらを呼び出しますか?

于 2010-05-12T01:53:27.180 に答える
0

クラスは複数のインターフェースを実装できますが、これは少し異なります。

親から継承すると、何かをオーバーライドすることを選択しない限り、すべてを取得できます。さらに、より具体的なものを追加して拡張できますが、親は子について何も知らないはずです。

インターフェイスを実装すると、インターフェイスはメソッドを定義しますが、メソッドは実装しません。それを実装するのはあなた次第です。さまざまなクラスがインターフェイスメソッドを実装できますが、インターフェイスの指示に従う限り、必要に応じて実装できます。

継承は使いすぎになる傾向があり、悪いプログラムにつながります。おそらく、解決しようとしている問題を教えていただければ、クラスをどのように構成できるかを提案することができます。

于 2010-05-12T02:36:54.070 に答える
0

PHPでインターフェイスを使用すると、問題が解決する可能性があります。

于 2010-05-12T03:52:16.943 に答える