JavaRush /Java blogi /Random-UZ /Polimorfizmdan foydalanish amaliyoti

Polimorfizmdan foydalanish amaliyoti

Guruhda nashr etilgan
Salom! Bugun biz OOP tamoyillari bo'yicha bir qator ma'ruzalarni yakunlaymiz . Ushbu darsda biz polimorfizm haqida gapiramiz. Polimorfizmdan foydalanish amaliyoti - 1Polimorfizm - bu bir nechta turlarga bir xil turdagi kabi munosabatda bo'lish qobiliyati. Bunday holda, ob'ektlarning xatti-harakati ularning qaysi turga mansubligiga qarab har xil bo'ladi. Keling, ushbu bayonotni batafsil ko'rib chiqaylik. Birinchi qismdan boshlaylik: "bir xil turdagi kabi bir nechta turlar bilan ishlash qobiliyati". Qanday qilib har xil turlar bitta va bir xil bo'lishi mumkin? Bir oz g'alati tuyuladi :/ Bu aslida oddiy. Misol uchun, bu holat merosdan normal foydalanish bilan yuzaga keladi. Keling, bu qanday ishlashini ko'rib chiqaylik. Aytaylik, bizda Catbitta usul run()- "yugurish" bilan oddiy ota-onalar sinfi bor:
public class Cat {

   public void run() {
       System.out.println("Бег!");
   }
}
CatKeling , sher, yo'lbars va gepardni bildiruvchi , Lionva Tigerdan meros bo'lgan uchta sinfni yarataylik .Cheetah
public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Лев бежит со speedю 80 км/ч");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Тигр бежит со speedю 60 км/ч");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Гепард бежит со speedю до 120 км/ч");
   }
}
Shunday qilib, bizda 3 ta dars bor. Keling, ular bilan xuddi bir sinfdagidek ishlashimiz mumkin bo'lgan vaziyatni simulyatsiya qilaylik. Tasavvur qilaylik, bizning mushuklarimizdan biri kasal bo'lib, doktor Aibolitning yordamiga muhtoj. AibolitKeling , sherlar, yo'lbarslar va gepardlarni davolashga qodir bo'lgan sinf yaratishga harakat qilaylik .
public class Aibolit {

   public void healLion(Lion lion) {

       System.out.println("Лев здоров!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Тигр здоров!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Гепард здоров!");
   }
}
Muammo hal qilinganga o'xshaydi - sinf yozilgan va foydalanishga tayyor. Ammo dasturimizni kengaytirmoqchi bo'lsak, nima qilamiz? Endi bizda faqat 3 tur mavjud: sherlar, yo'lbarslar va gepardlar. Ammo dunyoda mushuklarning 40 dan ortiq turlari mavjud. Agar dasturga Pallas mushuklari, yaguarlar, meyn-kunlar, uy mushuklari va boshqalar uchun alohida sinflarni qo'shsak, nima bo'lishini tasavvur qiling. Polimorfizmdan foydalanish amaliyoti - 2Dasturning o'zi, albatta, ishlaydi, lekin sinf Aibolitdoimiy ravishda har bir turdagi mushukni davolash uchun yangi usullarni qo'shishi kerak bo'ladi va natijada u misli ko'rilmagan o'lchamlarga etadi. Bu erda polimorfizmning xossasi paydo bo'ladi - "bir nechta turlar bilan bir xil turdagi kabi ishlash qobiliyati". Xuddi shu narsani bajaradigan son-sanoqsiz usullarni yaratishimiz shart emas - mushukni davolash. Barcha holatlar uchun bir vaqtning o'zida bitta usul etarli bo'ladi:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
   }
}
healCat()Biz ob'ektlarni ham Lion, Tigerob'ektlarni ham usulga o'tkazishimiz mumkin Cheetah- ularning barchasi Cat:
public class Main {

   public static void main(String[] args) {

       Aibolit aibolit = new Aibolit();

       Lion simba = new Lion();
       Tiger sherekhan = new Tiger();
       Cheetah chester = new Cheetah();

       aibolit.healCat(simba);
       aibolit.healCat(sherekhan);
       aibolit.healCat(chester);
   }
}
Konsol chiqishi:

Пациент здоров!
Пациент здоров!
Пациент здоров!
Shunday qilib, bizning sinfimiz Айболитturli tiplar bilan xuddi bir turdagi kabi ishlaydi. Endi ikkinchi qism bilan shug'ullanamiz: "bu holda ob'ektlarning xatti-harakati ularning qaysi turga mansubligiga qarab har xil bo'ladi". Bu erda ham hamma narsa oddiy. Tabiatda barcha mushuklar boshqacha yuguradi. Eng kamida, ularning yugurish tezligi farqlanadi. Bizning uchta uy hayvonlarimiz orasida gepard eng tez yuguradi, yo'lbars va sher esa sekinroq yuguradi. Ya'ni, ularning xatti-harakatlari boshqacha. Polimorfizm bizga nafaqat turli xil turlardan foydalanish imkoniyatini beradi. Shu bilan birga, bu ularning farqlarini unutmaslikka imkon beradi va ularning har biriga xos xatti-harakatlarni saqlaydi. Buni ushbu misol orqali tushunish mumkin. Aytaylik, muvaffaqiyatli tiklanishdan so'ng, bizning mushuklarimiz bayram qilish uchun bir oz yugurishga qaror qilishdi. Keling, buni sinfimizga qo'shamiz Aibolit:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
       cat.run();
   }
}
Keling, uchta hayvonni davolash uchun bir xil kodni ishga tushirishga harakat qilaylik:
public static void main(String[] args) {

   Aibolit aibolit = new Aibolit();

   Lion simba = new Lion();
   Tiger sherekhan = new Tiger();
   Cheetah chester = new Cheetah();

   aibolit.healCat(simba);
   aibolit.healCat(sherekhan);
   aibolit.healCat(chester);
}
Va natija shunday bo'ladi:

Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
Bu erda biz ob'ektlarimizning o'ziga xos xulq-atvori saqlanib qolganligini aniq ko'ramiz, garchi biz uchta hayvonni har birini "umumlashtirish" usuliga o'tkazgan bo'lsak ham Cat. Polimorfizm tufayli Java bular faqat uchta mushuk emas, balki boshqacha yuradigan sher, yo'lbars va gepard ekanligini yaxshi eslaydi. Bu polimorfizmdan foydalanishning asosiy afzalligi - moslashuvchanlik . Ko'p turlarga xos bo'lgan ba'zi funksiyalarni yaratishimiz kerak bo'lganda, sherlar, yo'lbarslar va gepardlar shunchaki "mushuk" ga aylanadi. Barcha hayvonlar har xil, lekin ba'zi holatlarda - mushuk qaysi turga tegishli bo'lishidan qat'i nazar, mushuk :) Mana siz uchun video tasdig'i.
Agar bu "umumlashtirish" talab qilinmasa va aksincha, turlarning xatti-harakatlari boshqacha bo'lishi kerak bo'lsa, har bir tur o'zini boshqacha tutadi. Polimorfizm tufayli siz keng doiradagi sinflar uchun yagona interfeys (uslublar to'plami) yaratasiz. Shu sababli, dasturlarning murakkabligi kamayadi. Agar biz dasturni 40 turdagi mushuklarga kengaytirganimizda ham, biz eng oddiy interfeysga ega bo'lamiz - run()barcha 40 mushuk uchun bitta usul.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION