Mengapa Saya Tidak Boleh Mengatasi Parameter Kaedah dengan Antara Muka Anak sebagai Parameter Baharu dalam PHP?

Barbara Streisand
Lepaskan: 2024-11-06 08:47:02
asal
960 orang telah melayarinya

Why Can't I Override Method Parameters with a Child Interface as a New Parameter in PHP?

Mengatasi Parameter Kaedah dengan Antara Muka Kanak-kanak sebagai Parameter Baharu: Mengapa Ia Gagal

Dalam PHP, kaedah overriding membenarkan subkelas mentakrifkan semula tingkah laku kaedah yang diwarisi daripada kelas induk. Walau bagaimanapun, terdapat sekatan tertentu untuk memastikan keserasian jenis dan pematuhan kepada prinsip OOP.

Pertimbangkan coretan kod berikut, yang cuba mengatasi kaedah setEngine() dalam antara muka WaterCar dengan parameter baharu jenis HydroEngine :

<code class="php"><?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>
Salin selepas log masuk

Coretan kod ini gagal dengan ralat berikut:

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

Sebab ralat ini ialah parameter kaedah mengatasi melanggar prinsip penggantian Liskov. Antara muka WaterCar mengisytiharkan jenis parameter yang berbeza untuk kaedah setEngine() daripada antara muka Kereta.

Secara khusus, antara muka Kereta menjangkakan parameter jenis Enjin, manakala antara muka WaterCar menjangkakan parameter jenis HydroEngine. Walaupun HydroEngine ialah subkelas Enjin, ia masih dianggap sebagai jenis yang berbeza.

Akibatnya, kelas yang melaksanakan WaterCar mungkin tidak dapat melaksanakan Kereta sepenuhnya kerana ia tidak dapat menerima parameter Enjin. Ini melanggar prinsip penggantian Liskov, yang menyatakan bahawa subjenis sepatutnya boleh digunakan sebagai ganti jenis induknya tanpa menyebabkan kelakuan yang tidak dijangka.

Dalam erti kata lain, jika sesuatu fungsi mengharapkan Kereta, ia sepatutnya dapat untuk menerima WaterCar tanpa sebarang masalah. Walau bagaimanapun, dalam kes ini, fungsi itu akan gagal jika lulus WaterCar kerana ia menjangkakan parameter Enjin.

Untuk menyelesaikan isu ini, adalah perlu untuk mengekalkan keserasian dalam parameter kaedah antara antara muka ibu bapa dan anak. Jika gelagat khas diperlukan untuk subkelas tertentu, adalah lebih baik untuk menentukan kaedah tambahan daripada mengatasi jenis parameter.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mengatasi Parameter Kaedah dengan Antara Muka Anak sebagai Parameter Baharu dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!