重複の可能性:
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つは、「多重継承のユースケースは非常に小さく、通常、複数のインターフェイス、ミックスインなどを使用して解決できる」ということです。しかし実際には、言語設計者が純粋な多重継承を実装することをわざわざしなかった、より正当な理由がなければなりません。
私はここで完全にポイントを逃していますか?誰かがこれにもっと光を当てることができますか?