JavaRush /Java блогы /Random-KK /Интерфейстердегі әдепкі әдістер

Интерфейстердегі әдепкі әдістер

Топта жарияланған
Java-ның әрбір жаңа нұсқасы алдыңғы нұсқалардан ерекшеленеді. Міне, біз қарастырған материалдағы өзгерістердің мысалы: Java 5-ке дейін enumтілде ешқандай «'» жоқ.
Интерфейстердегі әдепкі әдістер - 1
Сол сияқты, Java 8 Java 7-ден айтарлықтай ерекшеленеді. Біздің лекцияларымыздың көпшілігі тілдің 7-нұсқасында жазылған, бірақ, әрине, маңызды жаңалықтарды назардан тыс қалдырмаймыз. Бұл дәрісте интерфейстер туралы айтып жатқандықтан, бір жаңартуды қарастырайық - интерфейстердегі әдепкі әдістер . Интерфейс іске қосылмайтынын білесіз . Оның міндеті - оны жүзеге асыратын барлық an objectілерде қандай мінез-құлық болуы керек екенін сипаттау . Бірақ әзірлеушілер барлық сыныптарда әдісті енгізу бірдей болатын жағдайларды жиі кездестірді. Ескі машинаның мысалын қарастырайық:
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("Тормоз!");
   }
}
Бұл codeтың негізгі мәселесі неде деп ойлайсыз? Сіз бір codeтың бір топтамасын жазғанымызды байқаған боларсыз! Бұл мәселе бағдарламалауда жиі кездеседі және оны болдырмау керек. Тағы бір нәрсе, Java 8 шығарылғанға дейін арнайы шешім опциялары болмаған. Бұл нұсқа шыққан кезде әдепкі әдістерді анықтау және оларды интерфейстің ішінде енгізу мүмкін болды! Бұл қалай орындалды:
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()Енді барлық машиналар үшін бірдей болған және әдістері brake()интерфейске енгізілген және қайталанатын code қажет емес. Сонымен қатар, әдістер әр сыныпта қол жетімді!
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();
   }
}
Әдісі бар 100 сынып болса gas(), бірақ олардың тек 99-ында бірдей әрекет болса ше? Бұл бәрін бұзады және бұл жағдайда әдепкі әдіс жұмыс істемейді ме? Әрине жоқ :) Интерфейстердің әдепкі әдістерін қайта анықтауға болады.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
Барлық қалған 99 типтегі машиналар әдепкі әдісті жүзеге асырады, ал сынып UnusualCar- ерекшелік - жалпы суретті бұзбайды және оның мінез-құлқын сабырлы түрде анықтайды. Интерфейстердегі бірнеше мұрагерлік Өздеріңіз білетіндей, Java тілінде көп мұра жоқ. Мұның көптеген себептері бар, біз оларды жеке дәрісте егжей-тегжейлі қарастырамыз. Басқа тілдерде, мысалы, C++ тілінде бұл керісінше. Бірнеше тұқым қуалау болмаса, күрделі мәселе туындайды: бір an objectінің бірқатар әртүрлі сипаттамалары мен «мінез-құлықтары» болуы мүмкін. Өмірден мысал: ата-анамыз үшін баламыз, ұстазымыз үшін студентпіз, дәрігер үшін науқаспыз. Өмірде біз әртүрлі рөлдерде пайда боламыз және сәйкесінше, өзімізді басқаша ұстаймыз: біз мұғалімдермен жақын достармен емес, басқаша сөйлесетініміз анық. Бұл жағдайды codeқа аударуға тырысайық. Бізде екі сынып бар деп елестетіп көрейік: тоған және құс аулау. Тоғанға жүзетін құстар керек, ал құс үйі үшін ұшатын құстар керек. Ол үшін біз екі негізгі класс құрдық - FlyingBirdжәне Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
Тиісінше, біз тұқым қуалайтын құстарды құстарға жібереміз FlyingBird, ал тоғанға - тұқым қуалайтын құстарды жібереміз Waterfowl. Барлығы қарапайым сияқты. Бірақ үйректі бір жерде анықтау керек болса, не істейміз? Ол әрі жүзеді, әрі ұшады. Бірақ бізде көп мұра жоқ. Бақытымызға орай, Java интерфейстердің бірнеше іске асырылуын қамтамасыз етеді. Егер сынып бірнеше ата-анадан мұра ала алмаса, бірнеше интерфейстерді енгізу оңай! Біздің үйрек ұшатын да, жүзетін де болуы мүмкін :) Қажетті нәтижеге жету үшін сыныптарды емес, FlyingBirdинтерфейстерді пайдалану жеткілікті .Waterfowl
public class Duck implements FlyingBird, Waterfowl {

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

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

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
Осының арқасында біздің бағдарламамыз икемді сыныпты басқаруды сақтайды және әдепкі әдістерді жүзеге асырумен бірге an objectілердің әрекетін анықтау мүмкіндігіміз шексіз дерлік болады! :)
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION