Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Mengatasi Parameter Kaedah Antara Muka dengan Antara Muka Kanak-kanak Melanggar Prinsip Penggantian Liskov?

Adakah Mengatasi Parameter Kaedah Antara Muka dengan Antara Muka Kanak-kanak Melanggar Prinsip Penggantian Liskov?

DDD
DDDasal
2024-11-06 09:08:02982semak imbas

Is Overriding Interface Method Parameters with Child Interfaces a Violation of Liskov Substitution Principle?

Mengatasi Parameter Kaedah Antara Muka: Kes Pelanggaran Penggantian Liskov

Dalam PHP, anda mungkin menghadapi situasi di mana mengatasi parameter kaedah antara muka dengan antara muka kanak-kanak membawa kepada ralat. Pertimbangkan kod berikut:

<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>

Malangnya, kod ini menghasilkan ralat:

Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)

Sebab Ralat

Ralat berlaku kerana dengan mengatasi kaedah setEngine dalam antara muka WaterCar, anda melanggar prinsip penggantian Liskov. Prinsip ini menyatakan bahawa subkelas harus boleh digantikan untuk kelas induknya tanpa melanggar tingkah laku program.

Antara muka WaterCar, sebagai subkelas Kereta, mesti menerima jenis parameter yang sama seperti kaedah setEngine antara muka induk, iaitu Enjin. Dengan mengatasinya dengan HydroEngine, anda mengecilkan jenis parameter yang boleh diterima, menjadikan WaterCar kurang boleh digantikan daripada Kereta.

Penyelesaian

Untuk menyelesaikan isu ini, anda mesti memastikan bahawa subkelas antara muka mematuhi jenis parameter yang sama seperti antara muka induk. Dalam kes ini, anda tidak seharusnya mengatasi kaedah setEngine dalam antara muka WaterCar, sebaliknya mewarisi takrifan antara muka Kereta.

Atas ialah kandungan terperinci Adakah Mengatasi Parameter Kaedah Antara Muka dengan Antara Muka Kanak-kanak Melanggar Prinsip Penggantian Liskov?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn