JavaRush /Блоги Java /Random-TG /Интерфейсҳо дар Java

Интерфейсҳо дар Java

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо дар бораи консепсияи муҳими Java - интерфейсҳо сӯҳбат хоҳем кард. Ин калима шояд ба шумо шинос бошад. Масалан, аксари барномаҳо ва бозиҳои компютерӣ интерфейс доранд. Ба маънои васеъ, интерфейс як навъ "идораи дурдаст" мебошад, ки ду тараферо, ки бо ҳамдигар ҳамкорӣ мекунанд, мепайвандад. Намунаи оддии интерфейс аз ҳаёти ҳаррӯза як идоракунии дурдасти телевизион аст. Он ду an objectро, як одам ва телевизорро мепайвандад ва вазифаҳои гуногунро иҷро мекунад: баланд ё паст кардани овоз, иваз кардани каналҳо, фурӯзон ё хомӯш кардани телевизор. Як тараф (шахс) бояд ба интерфейс дастрасӣ дошта бошад (тугмаи идоракунии дурдастро пахш кунед) барои иҷрои амал тарафи дигар. Масалан, барои телевизион ба канали дигар гузаштан. Дар ин ҳолат, корбар лозим нест, ки дастгоҳи телевизорро донад ва раванди тағир додани канал дар дохor он чӣ гуна амалӣ карда мешавад. Чаро интерфейсҳо дар Java лозиманд - 1Ҳама чизе, ки корбар дастрасӣ дорад, интерфейс аст . Вазифаи асосй ба даст овардани натичаи дилхох аст. Ин ба барномасозӣ ва Java чӣ иртибот дорад? Бевосита :) Эҷоди интерфейс ба эҷоди синфи муқаррарӣ хеле монанд аст, аммо ба ҷои калима classмо калимаи interface. Биёед соддатарин интерфейси Java-ро бубинем ва бифаҳмем, ки он чӣ гуна кор мекунад ва он барои чӣ лозим аст:
public interface Swimmable  {

     public void swim();
}
Мо интерфейсеро офаридаем Swimmable, ки шино карда метавонад . Ин чизе монанди пульти мост, ки як «тугма» дорад: усул swim() «шиновар» аст. Чӣ тавр мо метавонем ин " правленияи дурдаст " -ро истифода барем? Барои ин усул, яъне. тугмаи пульти мо-шинро ба амал баровардан лозим аст. Барои истифодаи интерфейс усулҳои он бояд аз ҷониби баъзе синфҳои барномаи мо амалӣ карда шаванд. Биёед синферо пайдо кунем, ки an objectҳои он ба тавсифи "шиноварӣ карда метавонанд" мувофиқат кунанд. Масалан, синфи мурғобӣ мувофиқ аст Duck:
public class Duck implements Swimmable {

    public void swim() {
        System.out.println("Duck, swim!");
    }

    public static void main(String[] args) {

        Duck duck = new Duck();
        duck.swim();
    }
}
Мо дар ин ҷо чӣ мебинем? Синф Duckбо интерфейс Swimmableбо истифода аз калимаи калидӣ алоқаманд аст implements. Агар шумо дар хотир доред, мо як механизми шабеҳро барои пайваст кардани ду синф дар мерос истифода мебурдем, танҳо калимаи " васеъият " мавҷуд буд. Барои возеҳ будан " public class Duck implements Swimmable"-ро айнан тарҷума кардан мумкин аст: "синфи оммавӣ Duckинтерфейсро амалӣ мекунад Swimmable." Ин маънои онро дорад, ки синфе, ки бо интерфейс алоқаманд аст, бояд ҳамаи усулҳои онро иҷро кунад. Лутфан таваҷҷӯҳ кунед: дар синфи мо, Duckба монанди интерфейс , Swimmableметод вуҷуд дорад swim()ва дар дохor он як навъ мантиқ вуҷуд дорад. Ин як талаботи ҳатмист. Агар мо танҳо “ ” нависем ва дар синф public class Duck implements Swimmableметоде эҷод намекардем , компилятор ба мо хато медиҳад: Duck абстрактӣ нест ва усули абстрактии swim()-ро дар Swimmable бекор намекунад Чаро ин рӯй медиҳад? Агар мо хаторо бо мисоли телевизор фаҳмонем, маълум мешавад, ки мо ба одам пулти пулти пулакиро бо тугмаи "канал иваз кардан" аз телевизоре медиҳем, ки чӣ тавр иваз кардани каналҳоро намедонад. Дар ин лаҳза тугмаро ба қадри дилхоҳатон пахш кунед, ҳеҷ кор намекунад. Худи пульти дурдаст каналҳоро иваз намекунад: вай танҳо ба телевизор сигнал медиҳад, ки дар дохor он раванди мураккаби иваз кардани канал амалӣ карда мешавад. Ҳамин тавр, дар мурғобии мо чунин аст: он бояд шино кунад, то ба он тавассути интерфейс дастрас шавад . Агар вай намедонад, ки ин корро чӣ тавр анҷом диҳад, интерфейс ду тараф - шахс ва барномаро пайваст намекунад. Одам наметавонад усулеро истифода барад , то an objectро дар дохor барнома шино кунад. Акнун шумо равшантар дидед, ки интерфейсҳо барои чӣ кор мекунанд. Интерфейс рафтореро тавсиф мекунад, ки синфҳое, ки ин интерфейсро амалӣ мекунанд, бояд дошта бошанд. «Рафтор» мачмуи усулхо мебошад. Агар мо мехоҳем, ки паёмбарони сершумор эҷод кунем, роҳи осонтарини ин эҷод кардани интерфейс аст . Ҳар як паёмбар бояд чӣ кор кунад? Дар шакли соддашуда паёмҳоро қабул ва ирсол кунед. swim()DuckSwimmableSwimmableswim()DuckMessenger
public interface Messenger{

     public void sendMessage();

     public void getMessage();
}
Ва ҳоло мо метавонем танҳо тавассути татбиқи ин интерфейс синфҳои паёмнависии худро эҷод кунем. Худи компилятор моро "маҷбур" мекунад, ки онҳоро дар дохor синфҳо татбиқ кунем. Telegram:
public class Telegram implements Messenger {

    public void sendMessage() {

        System.out.println("Sending a message to Telegram!");
    }

     public void getMessage() {
         System.out.println("Reading the message in Telegram!");
     }
}
WhatsApp:
public class WhatsApp implements Messenger {

    public void sendMessage() {

        System.out.println("Sending a WhatsApp message!");
    }

     public void getMessage() {
         System.out.println("Reading a WhatsApp message!");
     }
}
Вайбер:
public class Viber implements Messenger {

    public void sendMessage() {

        System.out.println("Sending a message to Viber!");
    }

     public void getMessage() {
         System.out.println("Reading a message in Viber!");
     }
}
Ин чӣ фоида меорад? Муҳимтарини онҳо пайвастагии фуҷур аст. Тасаввур кунед, ки мо барномаеро таҳия карда истодаем, ки дар он маълумоти муштариён ҷамъоварӣ карда мешавад. Синф Clientбояд майдоне дошта бошад, ки нишон медиҳад, ки муштарӣ кадом паёмнависро истифода мебарад. Бе интерфейсҳо он аҷиб менамояд:
public class Client {

    private WhatsApp whatsApp;
    private Telegram telegram;
    private Viber viber;
}
Мо се майдон эҷод кардем, аммо муштарӣ метавонад ба осонӣ танҳо як паёмнавис дошта бошад. Мо танҳо намедонем, ки кадоме аз онҳо. Ва барои он ки бе муошират бо муштарӣ намонед, шумо бояд ҳамаи имконоти имконпазирро ба синф "тела кунед". Маълум мешавад, ки як ё ду нафари онҳо ҳамеша дар он ҷо хоҳанд буд nullва барои кор кардани барнома онҳо умуман лозим нестанд. Ба ҷои ин, беҳтар аст, ки интерфейси моро истифода барем:
public class Client {

    private Messenger messenger;
}
Ин як мисоли "пайванди фуҷур" аст! Ба ҷои муайян кардани синфи мушаххаси паёмнависӣ дар синф Client, мо танҳо қайд мекунем, ки муштарӣ паёмбар дорад. Кадомаш дар рафти барнома муайян мешавад. Аммо барои чӣ ба мо интерфейсҳо лозиманд? Чаро онҳо умуман ба забон илова карда шуданд? Савол хуб ва дуруст аст! Ҳамин натиҷаро метавон бо истифода аз мероси оддӣ ба даст овард, дуруст? Синф синфи Messengerволидайн аст, ва Viber, Telegramва WhatsAppворисон мебошанд. Дарвоқеъ, ин корро кардан мумкин аст. Аммо як дастёбӣ ҳаст. Тавре ки шумо аллакай медонед, дар Java мероси сершумор вуҷуд надорад. Аммо якчанд татбиқи интерфейсҳо мавҷуданд. Синф метавонад интерфейсҳои зиёдеро, ки мехоҳад, татбиқ кунад. Тасаввур кунед, ки мо синфе дорем Smartphone, ки майдон дорад Application- барномае, ки дар смартфон насб шудааст.
public class Smartphone {

    private Application application;
}
Барнома ва мессенҷер, албатта, ба ҳам монанданд, аммо ба ҳар ҳол онҳо чизҳои гуногунанд. Messenger метавонад ҳам мобилӣ ва ҳам мизи корӣ бошад, дар ҳоле ки Ариза як барномаи мобилӣ аст. Ҳамин тавр, агар мо меросро истифода мекардем, мо наметавонем an objectро Telegramба синф илова кунем Smartphone. Охир, синф Telegramнаметавонад Applicationаз Messenger! Ва мо аллакай тавонистем онро аз Messenger, мерос гирем ва онро дар ин шакл ба синф илова кунем Client. Аммо синф Telegramметавонад ҳарду интерфейсро ба осонӣ татбиқ кунад! Аз ин рӯ, дар синф Clientмо метавонем an objectро Telegramҳамчун Messenger, ва дар синф Smartphoneҳамчун Application. Ин аст, ки чӣ тавр иҷро карда мешавад:
public class Telegram implements Application, Messenger {

    //...methods
}

public class Client {

    private Messenger messenger;

    public Client() {
        this.messenger = new Telegram();
    }
}


public class Smartphone {

    private Application application;

    public Smartphone() {
        this.application = new Telegram();
    }
}
Акнун мо метавонем синфро Telegramмувофиқи хоҳишамон истифода барем. Дар ҷое ӯ дар нақши Application, дар ҷое дар нақши Messenger. Эҳтимол шумо аллакай пай бурдаед, ки усулҳо дар интерфейсҳо ҳамеша “холӣ” ҳастанд, яъне онҳо амалӣ надоранд. Сабаби ин оддӣ аст: интерфейс рафторро тавсиф мекунад, на онро амалӣ мекунад. "Ҳама an objectҳои синфҳое, ки интерфейсро амалӣ мекунанд, Swimmableбояд шино кунанд": ин ҳама интерфейс ба мо мегӯяд. Чӣ тавр маҳз моҳӣ, мурғобӣ ё асп шино мекунад, савол барои синфҳо вуҷуд дорад Fish, Duckва Horse, на барои интерфейс. Ҳамон тавре ки иваз кардани канал вазифаи телевизион аст. Дастгоҳи дурдаст ба шумо танҳо як тугма медиҳад, ки ин корро кунед. Аммо, Java8 як иловаи ҷолиб дорад - усулҳои пешфарз. Масалан, интерфейси шумо 10 усул дорад. 9-тои онхо дар синфхои гуногун ба таври гуногун ичро карда мешаванд, вале яктоаш дар хама як хел ичро карда мешавад. Пештар, пеш аз интишори Java8, усулҳои дохor интерфейсҳо умуман татбиқ намешуданд: компилятор фавран хато кард. Акнун шумо метавонед инро чунин иҷро кунед:
public interface Swimmable {

   public default void swim() {
       System.out.println("Swim!");
   }

   public void eat();

   public void run();
}
Бо истифода аз калимаи калидӣ default, мо дар интерфейс усулеро бо татбиқи пешфарз офаридаем. Мо бояд ду усули дигарро татбиқ кунем eat()ва run()худамон дар ҳама синфҳое, ки Swimmable. Бо усули ин кор кардан лозим нест swim(): татбиқ дар ҳама синфҳо якхела хоҳад буд. Воқеан, шумо дар вазифаҳои гузашта бо интерфейсҳо зиёда аз як маротиба дучор омадаед, гарчанде ки шумо инро худатон пайхас накардаед :) Инак як мисоли равшан аст: Чаро ба мо интерфейсҳо дар Java лозиманд - 2Шумо бо интерфейсҳо Listва Set! Аниқтараш, бо татбиқи онҳо - ArrayList, LinkedList, HashSetва ғайра. Ҳамин диаграмма мисолеро нишон медиҳад, ки як синф якбора якчанд интерфейсҳоро амалӣ мекунад. Масалан, LinkedListон интерфейсҳоро амалӣ мекунад Listва Deque(навбати дутарафа). Шумо инчунин бо интерфейси Map, дурусттараш, бо татбиқи он шинос ҳастед - HashMap. Воқеан, дар ин диаграмма шумо як хусусиятро мебинед: интерфейсҳоро аз ҳамдигар мерос гирифтан мумкин аст. Интерфейс SortedMapаз Map, ва Dequeаз навбат мерос гирифта мешавад Queue. Ин зарур аст, агар шумо хоҳед, ки пайвасти байни интерфейсҳоро нишон диҳед, аммо як интерфейс versionи васеъи дигар аст. Биёед як мисолро бо интерфейс Queue- навбат дида бароем. Мо то ҳол коллексияҳоро аз назар гузаронидем Queue, аммо онҳо хеле содда ва мисли хати муқаррарӣ дар мағоза ҷойгир шудаанд. Шумо метавонед элементҳоро танҳо ба охири навбат илова кунед ва онҳоро танҳо аз аввал дур кунед. Дар марҳилаи муайян, таҳиягарон ба versionи васеъшудаи навбат ниёз доштанд, то элементҳо аз ҳарду ҷониб илова ва қабул карда шаванд. Ҳамин тавр интерфейс сохта шуд Deque- навбати дуҷониба. Он тамоми усулҳои навбати муқаррариро дар бар мегирад, зеро он «волидон»-и навбати дуҷониба аст, аммо усулҳои нав илова карда шудаанд.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION