- Inheritance and Exceptions
- Har qanday OOP tilida siz sinflar ierarxiyasini yaratishingiz mumkin va Dart ham bundan mustasno emas.
- Example :
- class A {}
- class B extends A {}
- Ko’rganingizdek, A super klass yoki “parent” deb ataladi, B esa subClass (yoki "child").
- Metodlar child classlarda qaytadan override qilib moslashtirilib ishlatilishi mumkin.
- @override izohi ixtiyoriy, lekin har doim yaxshisi buni ishlatgan ma’qul.
- class A {
- double test(double a) => a * 0.5;
- }
- class B extends A {
- @override double test(double a) => a * 1.5;
- }
- Starting from Dart 2.9 onwards, implicit downcasts are not allowed:
- Siz merosxo’rlikni bloklay olmaysiz, chunki har bir sinfda extends modifikator bo'lishi mumkin.
- Masalan, Java-da siz final class A {} yozishingiz mumkin, bu degani "Siz meros qilib olmaysiz mendan" deyishdi. Lekin Dartda bunday narsa yo'q.
- Oddiy metodalrdan tashqari siz setters (set) va getters (get) ni ham override qilishingiz mumkin. Dart C++ kabi bir nechta merosni qo'llab-quvvatlamaydi, ya'ni extends faqat bitta class bilan ishlaydi.
- // Ok class A {}
- class B extends A {
- }
- // Doesn't work
- super and constructors .
- Dartdagi har bir subsinf avtomatik ravishda superklassning standart konstruktorini chaqirishga harakat qiladi.
- Biroq, class oddiy yani constructor yo’q bo'lsa, super constructor kerak emas;
- abstract kalit so'zi to'g'ridan-to'g'ri yaratib(ishlatib) bo'lmaydigan classni belgilaydi, faqat undan meros olingan classlarga mumkin. abstract class odatdagidek bir (yoki bir nechta) konstruktorni bo’lishi mumkin.
- Odatda abstract class funksiya tanasiz, tananing o'rniga, nuqta-vergul (;) qo'yish
- bilan aniqlanishi mumkin bo'lgan abstract funksiyalarni o'z ichiga oladi. Oddiy
- classlarda abstract funsiyalarni aniqlay olmaysiz.
- getters va setters ham abstract bo'lishi mumkin
- abstract class Example { final int _a;
- const Example(this._a);
- // Abstract getter int get calculate;
- // Abstract method int doSomething(); }
- Boshqa dasturlash tillaridan farqli o'laroq, Dartda interface kalit so'zi yo'q va
- interfeyslarni yaratish uchun classlardan foydalanishingiz kerak. Sizning sinfingiz bir nechta interfacelarni amalga oshirishi mumkin.
- implements bu yerda kalit so’z. Oddiy classlardan farqli o'laroq, bu erda siz
- sinf/interfeys tomonidan belgilangan har bir methodni override qilishingiz kerak.
- abstract class A{ void read();
- }
- abstract class B{ void write();
- }
- class C implements A, B{
- @override read(){}
- @override write(){}}
- extends vs implements
- Biz extends child classlar uchun ekanligini ko’rdik, implements esa interface classlar uchun edi. Endi ikkisining texnik farqlarini korib chiqaylik:
- Class B extends A {} dan foydalanganda siz A classniing har bir methodni override qilishga majbur EMASsiz. Meros sodir bo'ladi va siz xohlagancha ko'p usullarni bekor qilishingiz mumkin.
- Implements da esa aksincha.
- Dart da bir nechta merosga yani multiple inheritance ga ruxsat berilmagan bo'lsa- da, siz class ni kengaytirishingiz va undan ko'proq narsani amalga oshirishingiz mumkin Masalan, Java va C# ham shunday yo'l tutadi.
- // Error
- class A extends B, C, D {}
- // Valid
- class A extends B implements C, D {}
- The Object class
- Kodda aniq yozilmagan bo'lsa ham, har qanday Dart klassi Object {} sinfidan turlatilgan bo’ladi. Bu ba'zi mashhur tillar bilan bir xil tuzilishdir Java, C# va Delphi kabi. Har bir class Object classida e'lon qilingan metodlarni bekor qilishi mumkin va kerak bo’lganda override qilib ishlatishi memkin bo’ladi.
- String toString().
- final f = Fraction(1, 2);
- final s = "My fraction is $f";
- bu yerda String interpolatsiyasi avtomatik ravishda toString() ni chaqiradi, bu kodni qisqartiradi va ko'proq o'qishli qiladi.
- Ikkita ob'ektni solishtirmoqchi bo'lganingizda == operatoridan foydalaniladi. Lekin bu doim siz kutgandek ishlamaydi agar ikkita o'zgaruvchi bir xil ob'ektga ishora qilmasa.
- Mantiqan biz ularni teng deb o'ylardik, lekin kompilyator bizga boshqa voqeani aytib beradi. ex1 va ex2
- mantiqan teng, lekin amalda farq qiladigan ikki xil ob'ektni ko'rsating, chunki har bir o'zgaruvchi boshqa havolaga ega.
- Istalgan xatti-harakatlarni olish uchun tenglik operatorini override qilishingiz kerak
Do'stlaringiz bilan baham: |