Mengapa Saya Tidak Boleh Mengatasi Parameter Kaedah dalam Antara Muka Kanak-kanak dalam PHP?

Mary-Kate Olsen
Lepaskan: 2024-11-08 01:38:02
asal
336 orang telah melayarinya

Why Can't I Override Method Parameters in Child Interfaces in PHP?

Parameter Kaedah Mengatasi: Perangkap dan Prinsip

Dalam pengaturcaraan berorientasikan objek, pewarisan membenarkan kelas terbitan memanjangkan atau mengubah suai tingkah laku induknya kelas. Walau bagaimanapun, terdapat had tertentu apabila ia berkaitan dengan parameter kaedah mengatasi.

Pertimbangkan kod berikut, di mana kami mempunyai antara muka Kereta dengan setEnjin kaedah yang menerima parameter jenis Enjin. Kami juga mempunyai antara muka kanak-kanak WaterCar yang memanjangkan Kereta dan mengisytiharkan setEngine kaedah berbeza, yang menerima parameter jenis HydroEngine, subjenis Enjin.

<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>
Salin selepas log masuk

Kod ini menimbulkan ralat:

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

Penaakulan:

Sebab ralat ini ialah WaterCar melanggar prinsip penggantian Liskov. Prinsip ini menyatakan bahawa "subkelas mesti boleh digantikan untuk kelas asasnya." Dalam kes ini, instance WaterCar tidak boleh digantikan dengan instance Kereta kerana kaedah setEnginenya mempunyai jenis parameter yang berbeza.

Walaupun HydroEngine ialah subjenis Enjin, ia masih merupakan jenis yang berbeza. Dengan mengatasi parameter kaedah dalam antara muka kanak-kanak, WaterCar memecahkan keserasian dengan antara muka induknya.

Ini boleh membawa kepada ralat masa jalan jika kod yang menjangkakan contoh Kereta diluluskan kepada tika WaterCar. Contohnya, kod berikut:

<code class="php">function checkEngine(Car $car) {
    $engine = new EngineImplementation();
    $car->setEngine($engine);
}</code>
Salin selepas log masuk

Akan gagal jika dipanggil dengan instance WaterCar kerana ia tidak boleh menerima parameter Enjin.

Kesimpulan:

Apabila mengatasi kaedah dalam kelas terbitan, adalah penting untuk mengekalkan keserasian dengan kelas induk dengan mengekalkan jenis parameter yang sama. Jika tidak, ia boleh membawa kepada ralat masa jalan dan melanggar prinsip reka bentuk berorientasikan objek.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mengatasi Parameter Kaedah dalam Antara Muka Kanak-kanak 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!