JavaRush /Java блогу /Random-KY /Интерфейстеги демейки ыкмалар

Интерфейстеги демейки ыкмалар

Группада жарыяланган
Java ар бир жаңы version мурункулардан айырмаланат. Бул жерде биз камтыган материалдагы өзгөрүүлөргө мисал келтирели: Java 5ке чейин enumтилде эч кандай "'s" жок болчу.
Интерфейстеги демейки ыкмалар - 1
Ошо сыяктуу эле, Java 8 Java 7ден байкаларлык айырмаланат. Биздин лекциялардын көбү тилдин 7-versionсында жазылган, бирок, албетте, биз маанилүү инновацияларды көз жаздымда калтырбайбыз. Бул лекцияда интерфейстер жөнүндө сөз болуп жаткандыктан, келгиле, бир жаңыртууну карап көрөлү - default methods in interfaces . Интерфейс ишке ашпай турганын мурунтан эле билесиз . Анын милдети - аны ишке ашыруучу бардык 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 чыкканга чейин атайын чечим варианттары болгон эмес. Бул version чыкканда, демейки ыкмаларды аныктоо жана аларды интерфейстин ичинде ишке ашыруу мүмкүн болду! Бул кандайча жасалат:
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- өзгөчө - жалпы сүрөттү бузbyte жана анын жүрүм-турумун тынч аныктайт. Интерфейстеги бир нече тукум куучулук Сиз билгендей, Javaда көп мурас жок. Мунун көптөгөн себептери бар, биз аларды өзүнчө лекцияда кеңири карап чыгабыз. Башка тилдерде, мисалы, C++ тorнде, бул тескерисинче. Көптөгөн тукум куучулук болбосо, олуттуу маселе жаралат: бир эле an object бир катар ар кандай мүнөздөмөлөргө жана "жүрүм-турумдарга" ээ болушу мүмкүн. Турмуштан бир мисал: ата-энебиз үчүн балабыз, мугалимибиз үчүн студентпиз, врачтар үчүн биз бейтаппыз. Жашоодо биз ар кандай ролдордо пайда болобуз жана ошого жараша өзүбүздү башкача алып жүрөбүз: биз мугалимдер менен жакын досторубузга караганда башкача сүйлөшөбүз. Келгиле, бул кырдаалды codeго которууга аракет кылалы. Бизде эки класс бар деп элестетип көрөлү: Көлмө жана Aviary. Көлмө үчүн сууда сүзүүчү канаттуулар, ал эми кушкана үчүн учуучу канаттуулар керек. Бул үчүн биз эки базалык класстарды түздүк - 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