JavaRush /Java Blogu /Random-AZ /Java-da interfeyslər

Java-da interfeyslər

Qrupda dərc edilmişdir
Salam! Bu gün Java-da vacib bir konsepsiya - interfeyslər haqqında danışacağıq. Bu söz yəqin ki, sizə tanışdır. Məsələn, əksər kompüter proqramları və oyunlarında interfeyslər var. Geniş mənada interfeys bir-biri ilə qarşılıqlı əlaqədə olan iki tərəfi birləşdirən bir növ “uzaqdan idarəetmə”dir. Gündəlik həyatdan interfeysin sadə nümunəsi televizorun pultudur. O, iki obyekti, bir insanı və televizoru birləşdirir və müxtəlif tapşırıqları yerinə yetirir: səsi artırmaq və ya azaltmaq, kanalları dəyişdirmək, televizoru yandırmaq və ya söndürmək. Bir tərəf (şəxs) hərəkəti yerinə yetirmək üçün digər tərəf üçün interfeysə daxil olmalıdır (pult düyməsini basın). Məsələn, televizorun kanalı növbəti kanala keçirməsi üçün. Bu halda istifadəçinin televizorun cihazını və onun daxilində kanalın dəyişdirilməsi prosesinin necə həyata keçirildiyini bilməsi lazım deyil. Java-da interfeyslər niyə lazımdır - 1İstifadəçinin bütün girişi interfeysdir . Əsas vəzifə istədiyiniz nəticəni əldə etməkdir. Bunun proqramlaşdırma və Java ilə nə əlaqəsi var? Birbaşa :) İnterfeys yaratmaq adi sinif yaratmağa çox bənzəyir, lakin sözün əvəzinə classbiz sözü qeyd edirik interface. Ən sadə Java interfeysinə baxaq və onun necə işlədiyini və nə üçün lazım olduğunu anlayaq:
public interface Swimmable  {

     public void swim();
}
Biz üzməyi bacaranSwimmable bir interfeys yaratdıq . Bu, bir "düyməsinə" malik olan pultumuza bənzəyir: üsul "üzmək" dir. Bu “ pultdən ” necə istifadə edə bilərik ? Bu məqsədlə metod, yəni. pultumuzdakı düyməni həyata keçirmək lazımdır. İnterfeysdən istifadə etmək üçün onun metodları proqramımızın bəzi sinifləri tərəfindən həyata keçirilməlidir. Gəlin obyektləri “üzə bilər” təsvirinə uyğun olan bir sinif tapaq. Məsələn, ördək sinfi uyğundur : swim()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();
    }
}
Biz burada nə görürük? Sinif açar sözündən istifadə edən Duckinterfeys ilə əlaqələndirilir . Yadınızdadırsa, biz mirasda iki sinfi birləşdirmək üçün oxşar mexanizmdən istifadə etdik, yalnız “ uzanır ” sözü var idi. Aydınlıq üçün “ ” hərfi tərcümə edilə bilər: “ictimai sinif interfeysi həyata keçirir .” Bu o deməkdir ki, interfeyslə əlaqəli sinif onun bütün metodlarını həyata keçirməlidir. Diqqət yetirin: bizim sinifdə interfeysdə olduğu kimi bir metod var və onun daxilində bir növ məntiq var. Bu məcburi tələbdir. Əgər biz sadəcə olaraq “ ” yazsaydıq və sinifdə metod yaratmasaq , tərtibçi bizə xəta verərdi: Duck mücərrəd deyil və Swimmable-da mücərrəd swim() metodunu ləğv etmir Niyə bu baş verir? Televiziya nümunəsi ilə səhvi izah etsək, məlum olur ki, biz bir insana kanal dəyişdirməyi bilməyən televizordan “kanal dəyişdir” düyməsi ilə pult veririk. Bu zaman düyməni istədiyiniz qədər sıxın, heç nə işləməyəcək. Uzaqdan idarəetmə özü kanalları dəyişdirmir: yalnız TV-yə siqnal verir, onun içərisində kanalın dəyişdirilməsinin mürəkkəb prosesi həyata keçirilir. Bizim ördəyimiz də belədir: o, üzməyi bacarmalıdır ki, ona interfeysdən istifadə etmək mümkün olsun . Bunu necə edəcəyini bilmirsə, interfeys iki tərəfi - insanı və proqramı birləşdirməyəcək. Bir şəxs proqram daxilində obyekti üzmək üçün metoddan istifadə edə bilməyəcək . İndi interfeyslərin nə üçün olduğunu daha aydın gördünüz. İnterfeys həmin interfeysi həyata keçirən siniflərin malik olmalı olduğu davranışı təsvir edir. “Davranış” metodlar toplusudur. Birdən çox messencer yaratmaq istəyiriksə, bunun ən asan yolu interfeys yaratmaqdır . Hər hansı bir messencer nə edə bilməlidir? Sadələşdirilmiş formada mesajları qəbul edin və göndərin. Swimmableimplementspublic class Duck implements SwimmableDuckSwimmableDuckSwimmableswim()public class Duck implements Swimmableswim()DuckSwimmableSwimmableswim()DuckMessenger
public interface Messenger{

     public void sendMessage();

     public void getMessage();
}
İndi biz sadəcə olaraq bu interfeysi tətbiq etməklə messenger siniflərimizi yarada bilərik. Kompilyatorun özü bizi onları siniflərdə tətbiq etməyə "məcbur edəcək". Teleqram:
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!");
     }
}
Viber:
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!");
     }
}
Bu hansı faydaları təmin edir? Onlardan ən vacibi boş birləşmədir. Təsəvvür edin ki, biz müştəri məlumatlarını toplayacağımız bir proqram hazırlayırıq. Sinifdə Clientmüştərinin hansı messencerdən istifadə etdiyini göstərən sahə olmalıdır. İnterfeyslər olmadan qəribə görünəcək:
public class Client {

    private WhatsApp whatsApp;
    private Telegram telegram;
    private Viber viber;
}
Biz üç sahə yaratdıq, lakin müştəri asanlıqla yalnız bir messencerə sahib ola bilər. Sadəcə hansının olduğunu bilmirik. Müştəri ilə ünsiyyətsiz qalmamaq üçün bütün mümkün variantları sinfə “itələməlisiniz”. Belə çıxır ki, onlardan bir və ya ikisi həmişə orada olacaq nullvə proqramın işləməsi üçün onlara ümumiyyətlə ehtiyac yoxdur. Bunun əvəzinə interfeysimizdən istifadə etmək daha yaxşıdır:
public class Client {

    private Messenger messenger;
}
Bu, "boş birləşmə" nümunəsidir! Sinifdə xüsusi bir messenger sinfini təyin etmək əvəzinə Client, biz sadəcə olaraq qeyd edirik ki, müştərinin messengeri var. Hansı biri proqramın gedişində müəyyənləşəcək. Bəs bunun üçün interfeyslərə niyə ehtiyacımız var? Niyə ümumiyyətlə dilə əlavə edildilər? Sual yaxşı və düzgündür! Eyni nəticəni adi mirasdan istifadə etməklə əldə etmək olar, elə deyilmi? Sinif Messengerana sinifdir, və Viber, TelegramWhatsAppvarisləridir. Doğrudan da, bunu etmək mümkündür. Amma bir tutum var. Artıq bildiyiniz kimi, Java-da çoxlu miras yoxdur. Ancaq interfeyslərin bir çox tətbiqi var. Bir sinif istədiyi qədər çox interfeys tətbiq edə bilər. Təsəvvür edin ki, bizdə Smartphonebir sahə olan bir sinif var Application- smartfonda quraşdırılmış proqram.
public class Smartphone {

    private Application application;
}
Tətbiq və messencer, əlbəttə ki, oxşardır, lakin yenə də fərqli şeylərdir. Messenger həm mobil, həm də masaüstü ola bilər, tətbiq isə mobil proqramdır. TelegramBeləliklə, mirasdan istifadə etsək, sinfə obyekt əlavə edə bilməyəcəkdik Smartphone. Axı, bir sinif miras Telegramala bilməz ! Və biz artıq onu miras almağı və bu formada sinfə əlavə etməyi bacardıq . Ancaq bir sinif hər iki interfeysi asanlıqla həyata keçirə bilər! Buna görə də, bir sinifdə bir obyekti , sinifdə isə kimi həyata keçirə bilərik . Bunun necə edildiyi belədir: ApplicationMessengerMessengerClientTelegramClientTelegramMessengerSmartphoneApplication
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();
    }
}
İndi sinifdən Telegramistədiyimiz kimi istifadə edə bilərik. Hardasa rolunda Application, haradasa rolunda çıxış edəcək Messenger. Siz yəqin ki, artıq fərq etmisiniz ki, interfeyslərdə metodlar həmişə “boşdur”, yəni onların icrası yoxdur. Bunun səbəbi sadədir: interfeys davranışı təsvir edir, həyata keçirmir. "İnterfeys həyata keçirən siniflərin bütün obyektləri Swimmableüzməyi bacarmalıdır": interfeys bizə bunu deyir. Bir balıq, ördək və ya atın tam olaraq necə üzəcəyi, interfeys üçün deyil, siniflər Fishüçün bir sual var. Necə ki, kanal dəyişdirmək televiziyanın işidir. Pult sizə bunu etmək üçün sadəcə bir düymə verir. Bununla belə, Java8-də maraqlı bir əlavə var - standart üsullar. Məsələn, interfeysinizdə 10 üsul var. Onlardan 9-u müxtəlif siniflərdə fərqli şəkildə həyata keçirilir, lakin biri hamısında eyni şəkildə həyata keçirilir. Əvvəllər, Java8-in buraxılmasından əvvəl interfeys daxilindəki metodların heç bir tətbiqi yox idi: kompilyator dərhal xəta verdi. İndi bunu belə edə bilərsiniz: DuckHorse
public interface Swimmable {

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

   public void eat();

   public void run();
}
Açar sözdən istifadə edərək default, standart tətbiqetmə ilə interfeysdə bir üsul yaratdıq. Digər iki metodu tətbiq etməmiz lazım olacaq eat()run(), tətbiq edəcəyimiz bütün siniflərdə özümüz Swimmable. Metodla bunu etməyə ehtiyac yoxdur swim(): tətbiq bütün siniflərdə eyni olacaq. Yeri gəlmişkən, siz keçmiş tapşırıqlarda bir neçə dəfə interfeyslərlə rastlaşmısınız, baxmayaraq ki, bunu özünüz fərq etməmisiniz :) Budur, bariz nümunə: Java-da interfeyslərə niyə ehtiyacımız var - 2Siz interfeyslərlə işləmisiniz ListSet! Daha doğrusu, onların həyata keçirilməsi ilə - ArrayList, LinkedList, HashSetvə s. Eyni diaqramda bir sinifin eyni anda bir neçə interfeys tətbiq etməsi nümunəsi göstərilir. Məsələn, LinkedListo, interfeysləri ListDeque(ikitərəfli növbə) həyata keçirir. Siz həmçinin interfeyslə Map, daha doğrusu, onun həyata keçirilməsi ilə tanışsınız - HashMap. Yeri gəlmişkən, bu diaqramda bir xüsusiyyət görə bilərsiniz: interfeyslər bir-birindən miras alına bilər. İnterfeys SortedMapnövbədən miras alınır MapDequenövbədən miras alınır Queue. İnterfeyslər arasındakı əlaqəni göstərmək istəyirsinizsə, bu lazımdır, lakin bir interfeys digərinin genişləndirilmiş versiyasıdır. İnterfeysli bir nümunəyə baxaq Queue- növbə. Biz hələ kolleksiyaları nəzərdən keçirməmişik Queue, lakin onlar olduqca sadədir və mağazada adi xətt kimi düzülüblər. Elementləri yalnız növbənin sonuna əlavə edə və onları yalnız əvvəldən götürə bilərsiniz. Müəyyən bir mərhələdə tərtibatçılar növbənin genişləndirilmiş versiyasına ehtiyac duydular ki, elementlər hər iki tərəfdən əlavə olunsun və qəbul edilsin. İnterfeys belə yaradıldı Deque- ikitərəfli növbə. O, adi növbənin bütün üsullarını ehtiva edir, çünki o, ikitərəfli növbənin “anasıdır”, lakin yeni üsullar əlavə edilmişdir.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION