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!