Templat Polimorfisme: Memahami Kovarian
Apabila berurusan dengan templat, adalah penting untuk menangani topik polimorfisme. Siasatan itu melibatkan struktur kelas dan pembina yang menggunakan templat. Walau bagaimanapun, apabila cuba memanggil pembina menggunakan contoh kelas templat, ralat berlaku. Ini menimbulkan persoalan: Adakah templat bukan polimorfik?
Invarian Templat
Bertentangan dengan sifat pewarisan dalam pengaturcaraan berorientasikan objek, templat tidak mempamerkan polimorfisme. Ini bermakna jika kelas B mewarisi daripada kelas A, tiada hubungan yang wujud antara kelas templat T dan T. Ini dikenali sebagai invarian templat.
Sebab Bukan Kovarian
Invarian templat wujud untuk mengekalkan keselamatan jenis. Jika templat adalah kovarian, parameter jenis dalam kelas induk boleh digantikan dengan parameter jenis dalam kelas anak. Ini akan membawa kepada kemungkinan isu ketidakpadanan jenis, seperti yang ditunjukkan dalam contoh berikut:
<code class="c++">struct Fruit {}; struct Apple : public Fruit {}; struct Orange : public Fruit {}; // Instantiate a vector using a specific type parameter vector<Apple> apple_vec; // If templates were covariant, the following would be legal vector<Fruit> &fruit_vec = apple_vec; // Push an element of a different type fruit_vec.push_back(Orange()); // Invalid operation!</code>
Dalam contoh ini, menambahkan oren pada vektor yang dimaksudkan untuk epal melanggar keselamatan jenis.
Mengatasi Masalah
Untuk menyelesaikan isu asal, pembina boleh menggunakan penegasan statik untuk mengesahkan bahawa parameter templat adalah jenis yang sama seperti antara muka yang dijangkakan. Penyelesaian lain melibatkan penggunaan ciri bahasa seperti kad bebas sempadan atau kekangan daripada Java atau C#, masing-masing.
Kesimpulan
Templat dalam C tidak mempamerkan polimorfisme, memastikan keselamatan jenis. Apabila menggunakan templat, adalah penting untuk mengetahui had ini dan menggunakan teknik seperti pernyataan statik atau ciri khusus bahasa untuk mengendalikan senario warisan dengan berkesan.
Atas ialah kandungan terperinci Adakah Templat Polimorfik dalam C ? Memahami Kovarians dan Jenis Keselamatan.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!