Bolehkah Kami Meningkatkan Kebolehgunaan Semula Corak Perlindungan Akses Berorientasikan Kunci?
Dalam bentuk semasa, corak perlindungan akses yang menggunakan kunci mempamerkan batasan dalam kebolehgunaannya semula. Untuk menangani isu ini, pelbagai penambahbaikan telah dicadangkan.
C 03 Penambahbaikan:
Menggunakan makro, kita boleh memudahkan dan membuat generalisasi corak. Makro PASSKEY mentakrifkan kunci laluan untuk kelas atau fungsi tertentu, menyediakan lokasi terpusat untuk mengurus kawalan akses. Berikut ialah contoh:
#define PASSKEY_1(pKeyname, pFriend1) \ class EXPAND(pKeyname) \ { \ private: \ friend EXPAND(pFriend1); \ EXPAND(pKeyname)() {} \ \ EXPAND(pKeyname)(const EXPAND(pKeyname)&); \ EXPAND(pKeyname)& operator=(const EXPAND(pKeyname)&); \ }
Walaupun kaedah ini meningkatkan kemudahan penggunaan corak, kaedah ini mempunyai kelemahan. Ia memerlukan pemanggil mengetahui kunci laluan khusus yang diperlukan dan boleh membawa kepada kekacauan makro.
Penambahan C 0x:
Dalam C 0x, corak boleh mencapai potensi terbesarnya terima kasih kepada templat variadic dan rakan parameter templat. Berikut ialah pelaksanaan:
template <typename T> class passkey { private: friend T; // Now possible in C++0x passkey() {} // Noncopyable passkey(const passkey&) = delete; passkey& operator=(const passkey&) = delete; }; #define PASSKEY_FUNCTION(pTag, pFunc, ...) \ struct EXPAND(pTag); \ \ template <> \ class passkey<EXPAND(pTag)> \ { \ private: \ friend pFunc __VA_ARGS__; \ passkey() {} \ \ passkey(const passkey&) = delete; \ passkey& operator=(const passkey&) = delete; \ }
Kini, setiap kelas mempunyai kunci laluannya yang unik dan fungsi boleh menentukan kunci laluan yang dibenarkan. Pemanggil hanya mencipta kunci laluan yang diperlukan dan menggunakan kaedah yang diingini. Pendekatan ini menawarkan peningkatan kebolehgunaan dan fleksibiliti melalui pelaksanaan generiknya.
Atas ialah kandungan terperinci Bolehkah Corak Perlindungan Akses Berorientasikan Kunci Dijadikan Lebih Boleh Digunakan Semula?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!