Rumah > Artikel > pembangunan bahagian belakang > Bolehkah Antara Muka Kanak-kanak Mengatasi Parameter Kaedah Antara Muka dengan Jenis Yang Lebih Khusus?
Mengatasi Parameter Kaedah Antara Muka dengan Antara Muka Kanak-kanak
Dalam kod PHP yang diberikan, percubaan dibuat untuk mengatasi kaedah setEngine antara muka Kereta dengan jenis parameter yang lebih khusus dalam antara muka kanak-kanak WaterCar. Walau bagaimanapun, ini mengakibatkan ralat maut:
<code class="php">Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)</code>
Penjelasan Ralat
Ralat berpunca daripada pelanggaran prinsip penggantian Liskov (LSP), yang menyatakan bahawa subjenis mesti boleh digantikan untuk superjenisnya. Dalam kes ini, antara muka WaterCar ialah subjenis antara muka Kereta, tetapi kaedah setEngine dalam WaterCar mempunyai jenis parameter yang berbeza (HydroEngine) daripada kaedah yang sepadan dalam Kereta (Enjin).
Ini menimbulkan isu keserasian . Kelas yang melaksanakan antara muka WaterCar mungkin tidak boleh dihantar sebagai hujah kepada fungsi yang mengharapkan objek Kereta, kerana kaedah setEngine tidak akan menerima parameter Enjin. Oleh itu, subkelas tidak memenuhi semua keperluan superclass, melanggar LSP.
Resolusi
Untuk menyelesaikan isu ini, kaedah setEngine dalam antara muka WaterCar harus mengekalkan keserasian dengan kaedah dalam antara muka Kereta. Ini bermakna mengekalkan jenis parameter yang sama (Enjin) atau menyediakan jenis yang lebih umum yang merangkumi Enjin, seperti Kenderaan.
<code class="php">interface WaterCar extends Car { function setEngine(Vehicle $engine); }</code>
Dengan perubahan ini, mana-mana kelas yang melaksanakan WaterCar masih boleh digunakan di tempat di mana Kereta dijangka, kerana ia kini menerima parameter jenis yang sama atau lebih umum.
Atas ialah kandungan terperinci Bolehkah Antara Muka Kanak-kanak Mengatasi Parameter Kaedah Antara Muka dengan Jenis Yang Lebih Khusus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!