4

重複の可能性:
PHPのクラスレベルで多重継承は許可されていますか?

したがって、PHPでは、多重継承が「直接」サポートされていないことを知っています(たとえば、Javaなどの他の多くの言語ではこれが当てはまると思います)。したがって、次のようなことを行います。

class A extends B implements C, D

そして今からPHP version 5.4、私は、私たちが持っていると思います、traitsそして複数のクラスによってするbunches functionality together..ことができます。used

さて、私の質問はこれです、なぜそのような言語で多重継承サポートがないのですか?

私は次のような意味です:

class A extends B, C

なぜこれを言語で実装するのが難しいのかを人々が説明しようとしているインターネット上の記事をいくつか読んだことがありますが、それらは私が理解するには技術的すぎるか、十分な議論のように聞こえませんでした。誰かがこれらの言語で多重継承をサポートするのが難しい理由を簡単に説明できますか?PHPは私が最もよく知っている言語なので、PHPのコンテキストに入れることができれば素晴らしいと思います。

あいまいさ(菱形継承問題など)が原因である可能性があると常に考えていますが、関数を宣言するときに、ある種の名前空間トークナイザーメカニズムで簡単に処理できると思います。これは、言語では、同じ関数を2回再定義する必要がある場合があります(Javaでのオーバーロードの動作など)。

<?php

class A{

    function __construct()
    {
    }

    function ambiguous_fn()
    {
        echo "This function is ambiguous";
    }

    function fnA()
    {
        echo "This is function A";
    }
}

class B{

    function __construct()
    {
    }

    function ambiguous_fn()
    {
        echo "This function is ambiguous";
    }

    function fnB()
    {
        echo "This is function B";
    }
}


class C extends A,B{

    function __construct()
    {
    }

    //This function will obviously confuse the PHP engine, because it does not know
    //if it should override from A or B. But cant we have a namespace/tokenizer kind of solution
    //to resolve the ambiguity? Or is that not possible?
    function ambiguous_fn()
    {

    }


}
?>

つまり、実際のオブジェクトを模倣する観点からすると、純粋な多重継承が非常に役立つと思うことがあります。議論の1つは、「多重継承のユースケースは非常に小さく、通常、複数のインターフェイス、ミックスインなどを使用して解決できる」ということです。しかし実際には、言語設計者が純粋な多重継承を実装することをわざわざしなかった、より正当な理由がなければなりません。

私はここで完全にポイントを逃していますか?誰かがこれにもっと光を当てることができますか?

4

1 に答える 1

4

多重継承を追加するのは難しいことではありません。多くの言語に多重継承が含まれていない理由は、それが少し難解で厄介だからです。多重継承は通常、コードを混同し、カプセル化を不十分にし、コードを予期しない動作にします。通常、コードで多重継承を許可すると、その言語から大量の悪いプログラミングが発生し、その結果、その言語の評判が悪くなります。その言語で何らかの理由で多重継承が必要な場合、それを適切に使用するのに十分賢いコーダーは、それを実行する独自のメソッドを作成するのに十分賢いでしょう。

于 2012-10-11T21:09:39.950 に答える