PHP で子インターフェイスのメソッド パラメータをオーバーライドできないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-08 01:38:02
オリジナル
336 人が閲覧しました

Why Can't I Override Method Parameters in Child Interfaces in PHP?

メソッド パラメーターのオーバーライド: 落とし穴と原則

オブジェクト指向プログラミングでは、継承により派生クラスが親の動作を拡張または変更できるようになります。クラス。ただし、メソッド パラメーターのオーバーライドに関しては、特定の制限があります。

次のコードを考えてみましょう。ここでは、Engine 型のパラメーターを受け入れるメソッド setEngine を持つインターフェイス Car があります。また、Car を拡張し、Engine のサブタイプである HydroEngine 型のパラメータを受け入れる別のメソッド setEngine を宣言する子インターフェイス WaterCar もあります。

<code class="php">interface Engine {
    function run();
}

interface HydroEngine extends Engine {
    function run();
}

interface Car {
    function setEngine(Engine $engine);
}

interface WaterCar extends Car {
    function setEngine(HydroEngine $engine);
}</code>
ログイン後にコピー

このコードではエラーが発生します:

Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
ログイン後にコピー

理由:

このエラーの理由は、WaterCar がリスコフ置換原則に違反しているためです。この原則は、「サブクラスはその基本クラスの代替可能でなければならない」と述べています。この場合、setEngine メソッドのパラメーターの型が異なるため、WaterCar インスタンスを Car インスタンスの代わりに使用することはできません。

HydroEngine は Engine のサブタイプであっても、依然として異なる型です。子インターフェイスのメソッド パラメーターをオーバーライドすることにより、WaterCar は親インターフェイスとの互換性を失います。

これにより、Car インスタンスを予期するコードに WaterCar インスタンスが渡されると、ランタイム エラーが発生する可能性があります。たとえば、次のコード:

<code class="php">function checkEngine(Car $car) {
    $engine = new EngineImplementation();
    $car->setEngine($engine);
}</code>
ログイン後にコピー

エンジン パラメータを受け入れることができないため、WaterCar インスタンスで呼び出すと失敗します。

結論:

派生クラスのメソッドをオーバーライドする場合、同じパラメーターの型を保持することで親クラスとの互換性を維持することが不可欠です。そうしないと、実行時エラーが発生し、オブジェクト指向の設計原則に違反する可能性があります。

以上がPHP で子インターフェイスのメソッド パラメータをオーバーライドできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!