2012-01-14 19 views
5

PHP OOPとタイプヒントに奇妙な問題があります。 methodは、インタフェース宣言と互換性がないことを言って、PHP OOP "実装に互換性がある必要があります"

abstract class AC {} 

class C extends AC {} 

interface I { 
    function method(AC $abstract); 
} 

class InterfaceImplementation implements I { 
    function method(C $concrete) {} 
} 

このコードは実行されません:ここでは例です。私はCがACを拡張して以来、互換性があると思います。この種の機能をどのように実装する予定ですか?

+4

私はあなたの 'interface I'は' method'が 'C'だけでなく' AC'を受け入れるという契約を意味しています...私は 'InterfaceImplementation'が実際にはないと同意します「I」を実装する。 – Wrikken

答えて

4

Bもあり、ACもあるとします。その場合、Iは、その実装のどれもがメソッドの引数としてBを受け入れることを要求します。ただし、InterfaceImplementationはありません。

大きな画像:実装で具体的なタイプを指定する必要がある場合は、デザインを再検討することができます。外部の世界には、知られている必要があるすべてがACでエンコードされており、どの具体的なサブクラスが転送されているかを知る必要があるのはInterfaceImplementationであってはなりません。たぶん、特定のものがAC?

さらに別のアップデートによって公開されたメソッドを介してCのコードに埋め込まれたと総称することができます:あなたはジェネリックを使用して欲しいものを達成することができるかもしれませんが、私は、彼らが内に存在しないと思いますPHP。

class InterfaceImplementation implements I { 
    function method(AC $concrete) {} 
} 

そしてC、すなわちのインスタンスとそれを呼び出す:あなたは別の興味深い質問:)

+1

'B'のことを受け入れるでしょう。' B'が 'AC'を拡張している場合を除き、あなたは正しいです。 – Wrikken

+0

私は、説明のおかげで参照してください – Fluffy

+0

申し訳ありませんが、 "Extebs AC"は "extend C"ではありません - 固定 – Nicolas78

1

ちょうどとしてそれを定義するかもしれない設計上の問題の詳細を共有している場合、私はまだだと思います。 ->method(new C());

Object InterfacesでPHPリファレンスマニュアル明記:

をインタフェースで定義されているようにインターフェースを実装するクラスは、全く同じメソッドシグネチャを使用しなければなりません。そうしないと、致命的なエラーが発生します。

+0

そうですが、私は彼がInterfaceImplementationをC引数だけを受け入れるように制限したいと思います – Nicolas78

関連する問題