ホームページ >バックエンド開発 >PHPチュートリアル >子インターフェイスは、より具体的な型でインターフェイス メソッド パラメータをオーバーライドできますか?
子インターフェイスによるインターフェイス メソッド パラメーターのオーバーライド
指定された PHP コードで、Car インターフェイスの setEngine メソッドをオーバーライドしようとします。子インターフェイス WaterCar のより具体的なパラメータ タイプを使用します。ただし、これにより致命的なエラーが発生します。
<code class="php">Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)</code>
エラーの説明
このエラーは、次のようなリスコフ置換原則 (LSP) の違反に起因します。サブタイプはそのスーパータイプと置換可能でなければならないということです。この場合、WaterCar インターフェイスは Car インターフェイスのサブタイプですが、WaterCar の setEngine メソッドのパラメータ タイプ (HydroEngine) は、Car (Engine) の対応するメソッドとは異なります。
これにより、互換性の問題が発生します。 。 setEngine メソッドは Engine パラメータを受け入れないため、WaterCar インターフェイスを実装するクラスは、Car オブジェクトを期待する関数に引数として渡すことができない場合があります。したがって、サブクラスはスーパークラスのすべての要件を満たしておらず、LSP が壊れています。
解決策
この問題を解決するには、WaterCar インターフェイスの setEngine メソッドを使用する必要があります。 Car インターフェイスのメソッドとの互換性を維持します。これは、同じパラメータ タイプ (Engine) を保持するか、Vehicle などの Engine を含むより一般的なタイプを提供することを意味します。
<code class="php">interface WaterCar extends Car { function setEngine(Vehicle $engine); }</code>
この変更により、WaterCar を実装するクラスは、Car が配置されている場所でも引き続き使用できます。同じタイプまたはより一般的なタイプのパラメータを受け入れるようになったため、これは期待されています。
以上が子インターフェイスは、より具体的な型でインターフェイス メソッド パラメータをオーバーライドできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。