Vorislik mavjud bo‘lgan sinfning ta’rifi asosida yangi sinfni yaratish imkonini beradi. Yangi sinf boshqasi asosida yaratilgach, uning ta’rifi avtomatik tarzda mavjud sinfning barcha maydonlari va usullariga vorislik qiladi. Avval mavjud bo‘lgan sinfning barcha maydonlari va usullari avtomatik tarzda voris sinfda paydo bo‘ladi. Vorislik voris sinfida biron-bir jihatdan to‘g‘ri kelmagan harakatni avvaldan ko‘ra bilish imkonini beradi. Bunday foydali xususiyat dasturiy ta’minot talablarining o‘zgarishiga moslashtirish imkonini beradi. Agar o‘zgartirishlar kiritishga ehtiyoj tug‘ilsa, bu holda eski sinf funksiyalariga vorislik qiluvchi yangi sinf yozib qo‘ya qolinadi. Keyin o‘zgartirilishi lozim bo‘lgan funksiyalarga qaytadan ta’rif beriladi hamda yangi funksiyalar qo‘shiladi. Bunday o‘rniga o‘rin qo‘yishning mazmuni shundan iboratki, u dastlabki sinf ta’rifini o‘zgartirmay turib, obyekt ishini o‘zgartirish imkonini beradi.
Dart dasturlash tilida vorislik extends kalit so'zi yordamida amalga oshiriladi. Ammo, avvalo, nima uchun vorislikga muhtoj bo'lishimiz mumkinligini ko'rib chiqaylik. Keling, quyidagi dasturni olaylik:
void main (){
Shaxs ali = Shaxs();
ali.ism = "Ali";
ali.yosh = 22;
ali.chiqarish();
Xodim hasanboy = Xodim();
hasanboy.ism = "Hasanboy";
hasanboy.yosh = 20;
hasanboy.chiqarish();
}
class Shaxs {
String ism = "";
int yosh = 0;
void chiqarish() => print("Ismi: $ism Yoshi: $yosh");
}
class Xodim {
String ism = "";
int yosh = 0;
String kompaniya = "";
void chiqarish() => print("Ismi: $ism Yoshi: $yosh");
}
Bu yerda biz shaxsni ifodalovchi Shaxs sinfi va bizda qandaydir kompaniyaning xodimini ifodalovchi Xodim sinfi mavjud. Garchi sinflar alohida ishlayotgan bo'lsa-da, biz Shaxs sinfining maydonlari va usulini Xodim sinfida takrorlanganligini ko'ramiz va vorislik bunday kod takrorlanishidan qochish imkonini beradi.
Vorislikga murojaat qilaylik:
void main (){
Xodim hasanboy = Xodim();
hasanboy.ism = "Hasanboy";
hasanboy.yosh = 20;
hasanboy.chiqarish();
}
class Shaxs {
String ism = "";
int yosh = 0;
void chiqarish() => print("Ismi: $ism Yoshi: $yosh");
}
class Xodim extends Shaxs {
String kompaniya = "";
}
Endi Xodim sinfi Shaxs sinfidan voris bo'lib qoladi. Vorislikni o'rnatish uchun class nomidan keyin extends kalit so'zi ko'rsatiladi va keyin voris qaysi sinfdan kelib chiqqanligi ko'rsatiladi.
class Xodim extends Shaxs
Voris olishda Xodim sinfi Shaxs sinfining barcha funksiyalarini - uning barcha maydonlari va usullarini o'z zimmasiga oladi va ulardan foydalanishi mumkin. Shuningdek, siz pastki sinfda Shaxs sinfida bo'lmagan yangi maydonlar va usullarni belgilashingiz mumkin. Natijada, kod ancha sodda va shuningdek, biz Xodim obyektini yaratishimiz va uning nomi va yosh maydonlari va ko'rsatish usuliga kirishimiz mumkin, garchi ular asosiy Shaxs sinfida aniqlangan bo'lsa ham.
Bunday holda, Shaxs sinfi ajdod sinf va Xodim sinfi esa avlod sinf deb ataladi.
Konstruktorlar va super kalit so'z
Maydonlar va usullardan farqli o'laroq, asosiy sinf konstruktorlari vorislik qilib olinmaydi. Agar asosiy sinf konstruktorni aniq belgilab qo'ysa (standart konstruktor hisobga olinmaydi), u holda konstruktorni belgilashda uni avlod sinfida chaqirish kerak:
void main (){
Xodim hasanboy = Xodim("Hasanboy", 20, "Google");
hasanboy.chiqarish();
}
class Shaxs {
String ism = "";
int yosh = 0;
Shaxs(this.ism, this.yosh);
void chiqarish() => print("Ismi: $ism Yoshi: $yosh");
}
class Xodim extends Shaxs {
String kompaniya = "";
Xodim(String ism, int yosh, this.kompaniya):super(ism, yosh);
}
Bu yerda Shaxs asosiy sinfi ikkita parametrni qabul qiluvchi konstruktorni belgilaydi. Voris olingan sinf Xodim, shuningdek, asosiy sinf konstruktorini chaqiradigan, unga nom va yosh parametrlarining qiymatini uzatuvchi konstruktorni belgilaydi. Olingan sinfdan asosiy sinfning funksionalligiga kirish uchun super kalit so'zidan foydalaning. Xususan, murojaat super(ism, yosh) aslida asosiy sinf konstruktoriga murojaatni ifodalaydi Shaxs(ism, yosh).
Agar voris sinfdagi konstruktorni belgilashda asosiy sinf konstruktorini chaqirmasak, unda xatolikka duch kelamiz. Shuni ta'kidlash kerakki, Dart dasturlash tilining so'nggi versiyalarida biz asosiy sinfga o'tish qiymatlarini quyidagicha qisqartirishimiz mumkin:
void main (){
Xodim hasanboy = Xodim("Hasanboy", 20, "Google");
hasanboy.chiqarish();
}
class Shaxs {
String ism = "";
int yosh = 0;
Shaxs(this.ism, this.yosh);
void chiqarish() => print("Ismi: $ism Yoshi: $yosh");
}
class Xodim extends Shaxs {
String kompaniya = "";
Xodim(super.ism, super.yosh, this.kompaniya);
}
Bunday holda, Xodim sinfida ushbu kod qatori
Xodim(super.ism, super.yosh, this.kompaniya);
ekvivalent bo'ladi:
Xodim(String ism, int yosh, this.kompaniya):super(ism, yosh);
Va ifoda super.ism aslida Shaxs asosiy sinfining konstruktoriga nom parametri qiymatini beradi.
Nomlangan konstruktorlarni bekor qilish
Siz asosiy sinfning konstruktorlarini bekor qilishingiz va ularga murojaat qilishingiz mumkin:
void main (){
Xodim hasanboy = Xodim("Hasanboy", 20, "Google");
hasanboy.chiqarish();
}
class Shaxs {
String ism = "";
int yosh = 0;
Shaxs(this.ism, this.yosh);
Shaxs.ism(this.ism);
void chiqarish() => print("Ismi: $ism Yoshi: $yosh");
}
class Xodim extends Shaxs {
String kompaniya = "";
Xodim(super.ism, super.yosh, this.kompaniya);
Xodim.ism(String ism) : super.ism(ism);
}
Usulni bekor qilish
Hosil bo'lgan sinflar o'z maydonlari va usullarini belgilashi mumkin, lekin asosiy sinf usullarining xatti-harakatlarini bekor qilishi va o'zgartirishi ham mumkin. Buning uchun @override izohi ishlatiladi. Shunday qilib, yuqoridagi misollarda, Xodim sinfi, shuningdek, xodim ishlaydigan kompaniyani saqlash uchun kompaniya maydonini belgilaydi. Xodim obyektini chiqarish() usuli ham o'z kompaniyasini ko'rsatsa yaxshi bo'lardi:
void main (){
Xodim hasanboy = Xodim("Hasanboy", 20, "Google");
hasanboy.chiqarish();
}
class Shaxs {
String ism = "";
int yosh = 0;
Shaxs(this.ism, this.yosh);
void chiqarish() => print("Ismi: $ism Yoshi: $yosh");
}
class Xodim extends Shaxs {
String kompaniya = "";
Xodim(super.ism, super.yosh, this.kompaniya);
@override
void chiqarish() {
print("Ismi: $ism Yoshi: $yosh");
print("Kompaniya: $kompaniya");
}
}
Olingan sinfda asosiy sinf usullarini chaqirish
Biroq, yuqoridagi misolda biz Xodim sinfidagi chiqarish() usulining ba'zi kodlari Shaxs sinfida chiqarish() usuli uchun kod bilan bir xil ekanligini ko'ramiz. Takrorlanishning oldini olish uchun biz super kalit so'z yordamida asosiy sinfdan chiqarish() usulini amalga oshirishni oddiygina chaqirishimiz mumkin :
void main (){
Xodim hasanboy = Xodim("Hasanboy", 20, "Google");
hasanboy.chiqarish();
}
class Shaxs {
String ism = "";
int yosh = 0;
Shaxs(this.ism, this.yosh);
void chiqarish() => print("Ismi: $ism Yoshi: $yosh");
}
class Xodim extends Shaxs {
String kompaniya = "";
Xodim(super.ism, super.yosh, this.kompaniya);
@override
void chiqarish() {
super.chiqarish();
print("Kompaniya: $kompaniya");
}
}