JavaRush /Java blogi /Random-UZ /Interfeyslardagi standart usullar

Interfeyslardagi standart usullar

Guruhda nashr etilgan
Java-ning har bir yangi versiyasi avvalgilaridan farq qiladi. Biz ko‘rib chiqqan materialdagi o‘zgarishlarga misol: Java 5 dan oldin enumtilda ‘’ harflari yo‘q edi.
Interfeyslardagi standart usullar - 1
Xuddi shunday, Java 8 Java 7 dan sezilarli darajada farq qiladi. Ko'pgina ma'ruzalarimiz tilning 7-versiyasida yozilgan, lekin, albatta, biz muhim yangiliklarni e'tiborsiz qoldirmaymiz. Biz ushbu ma'ruzada interfeyslar haqida gapirayotganimiz sababli, keling, bitta yangilanishni ko'rib chiqaylik - interfeyslarda standart usullar . Siz allaqachon interfeys amalga oshirilmasligini bilasiz . Uning vazifasi uni amalga oshiradigan barcha ob'ektlar qanday xatti-harakatlarga ega bo'lishi kerakligini tasvirlashdir . Ammo ko'pincha ishlab chiquvchilar barcha sinflarda usulni qo'llash bir xil bo'lgan holatlarga duch kelishdi. Keling, eski mashinamiz misolini ko'rib chiqaylik:
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
Sizningcha, ushbu kodning asosiy muammosi nimada? Ehtimol, biz bir xil kodni yozganimizni payqadingiz! Bu muammo dasturlashda keng tarqalgan va undan qochish kerak. Yana bir narsa shundaki, Java 8 chiqarilishidan oldin maxsus echim variantlari mavjud emas edi. Ushbu versiya paydo bo'lgach, standart usullarni aniqlash va ularni to'g'ridan-to'g'ri interfeys ichida amalga oshirish mumkin bo'ldi! Bu qanday amalga oshiriladi:
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
gas()Endi barcha mashinalar uchun bir xil bo'lgan va usullari brake()interfeysga kiritilgan va ikki nusxadagi kod kerak emas. Bundan tashqari, usullar har bir sinfda mavjud!
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
Agar metodga ega 100 ta sinf mavjud bo'lsa gas(), lekin ulardan faqat 99 tasi bir xil xatti-harakatlarga ega bo'lsa-chi? Bu hamma narsani buzadi va bu holda standart usul ishlamaydi? Albatta yo'q :) Interfeyslarning standart usullari bekor qilinishi mumkin.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
Boshqa barcha 99 turdagi mashinalar standart usulni amalga oshiradilar va sinf UnusualCar- istisno - umumiy rasmni buzmaydi va uning xatti-harakatlarini xotirjamlik bilan belgilaydi. Interfeyslarda bir nechta merosxo'rlik Ma'lumki, Java-da bir nechta meros yo'q. Buning sabablari ko'p, biz ularni alohida ma'ruzada batafsil ko'rib chiqamiz. Boshqa tillarda, masalan, C++ da, buning aksi. Ko'p meros bo'lmasa, jiddiy muammo paydo bo'ladi: bir xil ob'ekt bir qator turli xil xususiyatlarga va "xulq-atvorga" ega bo'lishi mumkin. Hayotdan bir misol: ota-onamiz uchun biz bolamiz, o'qituvchimiz uchun o'quvchimiz, shifokorlar uchun bemormiz. Hayotda biz turli rollarda namoyon bo'lamiz va shunga mos ravishda o'zimizni boshqacha tutamiz: biz yaqin do'stlardan ko'ra o'qituvchilar bilan boshqacha gaplashamiz. Keling, ushbu vaziyatni kodga aylantirishga harakat qilaylik. Tasavvur qilaylik, bizda ikkita sinf bor: Pond va Aviary. Hovuz uchun sizga suzuvchi qushlar kerak, qushxona uchun esa uchuvchi qushlar kerak. Buning uchun biz ikkita asosiy sinfni yaratdik - FlyingBirdva Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
FlyingBirdShunga ko'ra, biz qushlarga sinflari meros bo'lib qolgan qushlarni va hovuzga - dan tushgan qushlarni yuboramiz Waterfowl. Hamma narsa oddiy ko'rinadi. Ammo o'rdakni biron bir joyda aniqlashimiz kerak bo'lsa, nima qilamiz? U ham suzadi, ham uchadi. Ammo bizda bir nechta meros yo'q. Yaxshiyamki, Java interfeyslarning bir nechta ilovalarini taqdim etadi. Agar sinf bir nechta ota-onadan meros bo'lolmasa, bir nechta interfeyslarni amalga oshirish oson! Bizning o'rdak ham uchish, ham suzish bo'lishi mumkin :) Istalgan natijaga erishish uchun sinflardan ko'ra FlyingBirdinterfeyslardan foydalanish kifoya .Waterfowl
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
Buning yordamida dasturimiz moslashuvchan sinf boshqaruvini saqlab qoladi va standart usullarni amalga oshirish bilan birgalikda ob'ektlarning xatti-harakatlarini aniqlash qobiliyati deyarli cheksiz bo'ladi! :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION