Superga qo'ng'iroq qiling - Call super

Superga qo'ng'iroq qiling a kod hidi yoki naqshga qarshi ba'zilari ob'ektga yo'naltirilgan dasturlash tillar. Call super - bu dizayn namunasi bo'lib, unda ma'lum bir sinf kelib chiqqan subklassda foydalanuvchi talab qilinishini belgilaydi bekor qilish usuli va ma'lum bir nuqtada bekor qilingan funktsiyani o'zi qayta chaqirish. Bekor qilingan usul qasddan tugallanmagan bo'lishi mumkin va belgilangan tartibda uning funksionalligini oshirish uchun ustun usulga bog'liq. Biroq, tilning o'zi ushbu chaqiriqda belgilangan barcha shartlarni bajara olmasligi mumkinligi, buni anti-naqshga aylantiradi.

Tavsif

Ob'ektga yo'naltirilgan dasturlashda foydalanuvchilar mumkin meros subklasslardagi superklassning xususiyatlari va xatti-harakatlari. Subklass o'z superklassining usullarini bekor qilishi mumkin, bu esa superklassni amalga oshirish usulini o'zi amalga oshiradi. Ba'zida bekor qilish usuli superklassdagi mos keladigan funktsiyalarni to'liq almashtiradi, boshqa hollarda esa superklass usuli hali ham bekor qilish usulidan chaqirilishi kerak. Shuning uchun, dasturlash tillarining aksariyati bekor qilinishi kerak bo'lgan usul uni bajarish uchun superklassda aniqlangan usulni aniq chaqirishi kerak.

Super anti-pattern chaqiruvi interfeys yoki ramka foydalanuvchilariga ma'lum bir sinfdan pastki sinfni olish, ma'lum bir usulni bekor qilish va bekor qilingan usulni bekor qilish usulidan asl usulni chaqirishni talab qiladi:[1]

CallSuper anti-naqsh

Bu ko'pincha talab qilinadi, chunki superklass sinf yoki ramkaning to'g'ri ishlashi uchun ba'zi o'rnatish vazifalarini bajarishi kerak yoki superklassning asosiy vazifasi (bu usul bilan bajariladi) faqat subklass tomonidan ko'paytiriladi.

Anti-naqsh bu talab ota-onaga qo'ng'iroq qilish. Haqiqiy kodda subklassdagi usul hali ham superklassning ishlashini xohlashi mumkin bo'lgan ko'plab misollar mavjud, odatda bu faqat ota-onalarning funktsiyalarini ko'paytiradi. Agar u hali ham funktsiyani to'liq almashtirgan bo'lsa ham, ota-onani chaqirishi kerak bo'lsa, anti-naqsh mavjud.

Ushbu muammolarni hal qilish uchun yaxshiroq yondoshish o'rniga shablon uslubi namunasi, bu erda superklass subklasslar tomonidan amalga oshirilishi kerak bo'lgan va asl uslubga ega bo'lgan mutlaq mavhum usulni o'z ichiga oladi:[1]

CallSuper anti-naqshidan saqlanish

Tilning o'zgarishi

Ushbu anti-naqshning dasturlarda paydo bo'lishi, odatda, dasturlashning ozgina tillari kelib chiqqan sinfdan super usul chaqirilishini ta'minlash uchun shartnoma xususiyatini beradi. Ushbu xususiyatga ega bo'lgan bitta til juda radikal tarzda BETA. Xususiyat, masalan, cheklangan tarzda topilgan Java va C ++, bu erda bola sinf konstruktori har doim ota-ona konstruktorini chaqiradi.

Qo'llab-quvvatlaydigan tillar oldin va keyin kabi usullar Umumiy Lisp (xususan Umumiy Lisp ob'ekti tizimi ), ushbu anti-naqshni oldini olish uchun boshqa usulni taqdim eting. Subklass dasturchisi superklass usulini bekor qilish o'rniga superklass uslubidan oldin yoki keyin bajariladigan qo'shimcha usulni taqdim etishi mumkin. Shuningdek, superklass dasturchisi aniqlab berishi mumkin oldin, keyinva atrofida subklass harakatlariga qo'shimcha ravishda bajarilishi kafolatlangan usullar.

Misol

Video ijarasi do'koni inventarizatsiyasi to'g'risida hisobot tuzish uchun sinf mavjud deb taxmin qiling. Har bir alohida do'konda hozirda mavjud bo'lgan videolarni jadvalga kiritishning boshqacha usuli mavjud, ammo yakuniy hisobotni yaratish algoritmi barcha do'konlarda bir xil. Qo'ng'iroq super anti-naqshini ishlatadigan ramka quyidagi mavhum sinfni taqdim etishi mumkin C # ):

mavhum sinf ReportGenerator {    jamoat virtual Hisobot CreateReport() {        // Umumiy hisobot ob'ektini yaratish        // ...        qaytish yangi Hisobot(...);    }}

Sinf foydalanuvchisi quyi sinfni amalga oshirishi kutilmoqda:

sinf BetonReportGenerator : ReportGenerator {    jamoat bekor qilish Hisobot CreateReport() {        // Ma'lumotlarni do'konga xos tarzda jadvalga qo'ying        // ...        // Ushbu sinf dizayni uchun ota-ona CreateReport () funktsiyasini         // bekor qilingan funktsiya oxiri. Ammo ushbu satr osongina qoldirilishi mumkinligiga e'tibor bering        // qaytgan hisobot qo'ng'iroqdan so'ng sinf dizaynini buzgan holda yanada o'zgartirilishi mumkin        // va ehtimol kompaniya miqyosidagi hisobot formati.        qaytish tayanch.CreateReport();    }}

Afzal interfeys quyidagicha ko'rinadi:

mavhum sinf ReportGenerator {    jamoat Hisobot CreateReport() {        Tabulyatsiya();        // Umumiy hisobot ob'ektini yaratish        // ...        qaytish yangi Hisobot(...);    }     himoyalangan mavhum bekor Tabulyatsiya();}

Amalga oshirish ushbu sinfni quyidagicha bekor qiladi:

sinf BetonReportGenerator : ReportGenerator {    himoyalangan bekor qilish bekor Tabulyatsiya() {        // Ma'lumotlarni do'konga xos tarzda jadvalga qo'ying        // ...    }}

Adabiyotlar

  1. ^ a b Fowler, Martin. "MF Bliki: CallSuper".