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>
Kod ini menimbulkan ralat:
Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
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>
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!