メソッド パラメーターのオーバーライド: 落とし穴と原則
オブジェクト指向プログラミングでは、継承により派生クラスが親の動作を拡張または変更できるようになります。クラス。ただし、メソッド パラメーターのオーバーライドに関しては、特定の制限があります。
次のコードを考えてみましょう。ここでは、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 サイトの他の関連記事を参照してください。