Bosh sahifa Wiki Method overriding

Method overriding

Method overriding — subclass parent class yoki interface’dan meros olingan instance method uchun yangi implementatsiya berishidir. Caller parent type orqali murojaat qilsa ham dynamic dispatch obyektning real runtime type’iga mos override’ni tanlaydi. Overriding method overloadingdan farq qiladi: overloading bir nomga turli parameter signature, overriding esa merosdagi ayni contractni qayta bajaradi.

Mos signature

Til override uchun method nomi, parameterlar va ayrim hollarda return type mosligini talab qiladi. Covariant return subclassga torroq return type berishga ruxsat qilishi mumkin. Access modifier parent methoddan toraytirilmaydi. Checked exception ishlatadigan tillarda override kengroq exception contractini qo‘sha olmasligi mumkin.

override annotation yoki keyword compilerga niyatni bildiradi. Parent signature o‘zgarsa yangi, bog‘lanmagan method yaratish o‘rniga compile xato chiqadi. Bu typo va versiya o‘zgarishini erta topadi. Virtual bo‘lmagan, final yoki private method override qilinmaydi.

Dynamic dispatch

Call site receiver type’ining method table’i orqali implementatsiyani tanlaydi. Compiler targetni isbotlasa devirtualization va inlining qilishi mumkin. JIT monomorphic call site uchun guardli tez yo‘l yaratadi. Semantika optimallashtirishdan keyin ham ayni override’ni tanlashi kerak.

Parent implementatsiyasini super orqali chaqirish mumkin. Bu initialization yoki umumiy invariantni saqlashi mumkin, ammo subclass parent ichki call orderiga qattiq bog‘lanadi. Parent method template hook sifatida mo‘ljallanmagan bo‘lsa override fragile bo‘ladi.

Contractni saqlash

Liskov substitution bo‘yicha subclass parent kutilgan joyda xatti-harakatni buzmasdan ishlaydi. Override preconditionni kuchaytirmaydi, postconditionni zaiflashtirmaydi va parent invariantini saqlaydi. Masalan, parent barcha qiymatlarni qabul qilsa subclass faqat musbat qiymatni jim rad eta olmaydi.

Behavior contract faqat type signature emas. Idempotency, thread safety, exception, ordering va latency expectation ham muhim. Override network I/O qo‘shsa oldin tez bo‘lgan property access kutilmagan failure boundaryga aylanadi.

Keng tarqalgan xatolar

Method parameteri ozgina farq qilsa override o‘rniga overload yaratilishi mumkin. Base reference orqali boshqa method chaqiriladi. Static method hiding dynamic overriding emas. Constructor ichida virtual method chaqirish subclass state hali initialize bo‘lmaganda override’ni ishga tushiradi.

Equals va hash kabi framework methodlarini override qilishda ularning o‘zaro contracti saqlanadi. Equality symmetric va transitive bo‘lishi kerak; mutable field hashga kirsa collection buziladi. Serialization callback va lifecycle methodlar ham framework hujjatiga mos signature talab qiladi.

Testlash

Contract test har implementationga bir xil test suite’ni qo‘llaydi. Base behavior va subclass extension alohida tekshiriladi. Mock override real parent lifecycle’ni yashirmasligi uchun kamida bitta concrete integration test bo‘ladi. Hierarchy ko‘p special-case override talab qilsa strategy yoki compositionga o‘tish dizaynni soddalashtirishi mumkin.

Shartnoma va substitutsiya

Override ajdod metodining faqat nomini emas, mantiqiy shartnomasini ham saqlashi kerak. Avlod metod kirish talabini kuchaytirsa yoki kafolatlangan natijani zaiflashtirsa, ajdod o‘rnida ishlatilganda kutilmagan xato yuz beradi. Bu Liskov substitutsiya tamoyili bilan bog‘liq. Istisno turi, yon ta’sir va ishlash xarakteristikasi ham amaliy shartnomaning qismi bo‘lishi mumkin. super chaqiruvi har doim majburiy emas, lekin ajdod muhim invariantni o‘rnatsa, uni tashlab ketish obyektni yaroqsiz holatga olib keladi. Testlar metodni faqat avlod turi orqali emas, ajdod interfeysi orqali chaqirib, polimorfik xatti-harakatni tekshirishi kerak.

Bog‘liq tushunchalar

Inheritance, Dynamic dispatch, Method overloading, Polymorphism, Virtual method, Liskov substitution principle, Superclass