Abstract class — to‘liq instance yaratish uchun mo‘ljallanmagan, subclasslar uchun umumiy contract va qisman implementatsiya beradigan classdir. Unda abstract methodlar tanasiz e’lon qilinishi, concrete methodlar esa umumiy xatti-harakatni amalga oshirishi mumkin. U inheritance hierarchy’da yaqin turlar orasida holat va kodni bo‘lishish uchun ishlatiladi.
Abstract va concrete a’zolar
Abstract method subclass bajarishi kerak bo‘lgan operatsiyani belgilaydi. Concrete method umumiy algoritmni beradi va abstract hooklarni chaqirishi mumkin. Protected field yoki method avlodlar uchun ochiladi, lekin bu couplingni kuchaytiradi. Invariant parent constructor va final operationlar orqali saqlanishi mumkin.
Template Method patternida algoritm skeleti abstract classda, o‘zgaruvchi qadamlar subclasslarda bo‘ladi. Masalan, import jarayoni faylni ochish, parse, validate va save ketma-ketligini belgilaydi; formatga xos parser subclass tomonidan beriladi. Hook contracti precondition, postcondition va exception semantikasini tushuntiradi.
Interface bilan farqi
Interface odatda capability contractini ifodalaydi va consumer implementatsiyaning ichki holatiga bog‘lanmaydi. Abstract class constructor, field va shared implementation bera oladi. Ko‘p tillarda class faqat bitta parentdan meros oladi, bir nechta interface’ni esa amalga oshirishi mumkin.
Bir-biriga yaqin, umumiy invariant va lifecycle’ga ega turlar abstract classga mos. Bog‘liq bo‘lmagan classlar bir capability’ni bersa interface afzal. Faqat kodni qayta ishlatish uchun “is-a” aloqasini majburlash hierarchy’ni nozik qiladi; composition collaboratorni aniqroq almashtiradi.
Dizayn xavflari
Fragile base class muammosida parent implementatsiyasi o‘zgarsa subclassning yashirin taxmini buziladi. Constructor abstract methodni chaqirsa subclass hali to‘liq initialize bo‘lmagan holatda ishlaydi. Override parent methodning preconditionini kuchaytirib yoki postconditionini zaiflashtirib Liskov substitutionni buzmasligi kerak.
Protected mutable state subclasslarga parent invariantini chetlab o‘tish imkonini beradi. Private field va tor protected method xavfsizroq. Parent yangi abstract method qo‘shsa barcha subclass breaking change oladi; default implementation compatibilityni saqlashi mumkin, lekin ma’noli default bo‘lmasa xatoni yashiradi.
Testlash
Abstract class bevosita instance qilinmasa, minimal test subclass yoki real implementatsiyalar orqali umumiy behavior tekshiriladi. Contract test barcha subclasslar bir xil invariantni bajarishini tasdiqlaydi. Faqat parent private detalini testlash emas, public observable xatti-harakat muhim.
Mock yaratishda framework abstract methodlarni avtomatik to‘ldirishi mumkin, ammo real constructor va lifecycle xatosini yashiradi. Kamida bitta integration test concrete subclass bilan ishlaydi. Hierarchy ko‘p conditional va override bilan murakkablashsa strategy compositionga refactoring ko‘rib chiqiladi.
Evolyutsiya va API
Public framework abstract classini tashqi consumerlar subclass qilsa protected API ham compatibility contractiga aylanadi. Yangi virtual method, constructor talabi yoki call order o‘zgarishi source yoxud binary compatibilityni buzishi mumkin. Framework extension uchun tor interface va composition point berib, ichki base classni public qilmasligi mumkin. Sealed override subclassning muhim invariantni o‘zgartirishini cheklaydi. Serialization runtime type nomiga bog‘lansa class ko‘chirish eski data’ni buzadi; barqaror discriminator va migration ishlatiladi. Plugin host subclassni untrusted code’dan yuklasa u ayni process privilege’ida ishlaydi, shuning uchun abstraction security sandbox emas.
Abstract class factory orqali yaratilsa caller concrete type’ni bilmaydi. Factory configurationni tekshiradi va noma’lum discriminatorni xavfsiz xato bilan rad etadi.
Bog‘liq tushunchalar
Class, Interface, Inheritance, Template Method, Composition, Polymorphism, Liskov substitution principle