JavaRush /Kurslar /All lectures for UZ purposes /Interfeyslar — bu interfeyslar emas, bu xatti-harakatlar

Interfeyslar — bu interfeyslar emas, bu xatti-harakatlar

All lectures for UZ purposes
Daraja, Dars
Mavjud

— Salom, Amigo! Bu menman, yana bir martta. Interfeyslar haqida yana bir qarash bilan tanişdirishni istayman. Tushunasanmi, class — aksariyat hollarda aniq bir obyektning modeli. Interfeys esa obyektdan ko'ra ko'proq qobiliyatlar yoki rollarga mos keladi.

Interfeyslar — bu interfeyslar emas, bu xatti-harakatlar - 1

Misol uchun, mashina, velosiped, mototsikl va g'ildirak kabi narsalarni klasslar va obyektlar shaklida tasavvur qilish eng yaxshi yo'ldir. Ammo «yura olish», «odamlarni tashiy olish», «turish» kabi qobiliyatlarni interfeyslar sifatida tasavvur qilish yaxshiroq. Mana misol:

Java Kodi Izoh
interface Moveable {
    void move(String newAddress);
}
— harakatlana olish qobiliyatiga mos keladi.
interface Driveable {
    void drive(Driver driver);
}
— haydovchi tomonidan boshqarila olish qobiliyatiga mos keladi.
interface Transport {
    void addStuff(Object stuff);
    Object removeStuff();
}
— yuklarni tashiy olish qobiliyatiga mos keladi.
class Wheel implements Moveable {
    ...
}
— «g'ildirak» classi. Harakatlana olish qobiliyatiga ega.
class Car implements Moveable, Drivable, Transport {
    ...
}
— «mashina» classi. Harakatlana olish, odam tomonidan boshqarila olish va yuklarni tashiy olish qobiliyatlariga ega.
class Skateboard implements Moveable, Driveable {
    ...
}
— «skeytbord» classi. Harakatlana olish va odam tomonidan boshqarila olish qobiliyatlariga ega.

Interfeyslar dasturchining hayotini juda osonlashtiradi. Ko'pincha dasturning ichida minglab obyektlar, yuzlab klasslar va faqat bir nechta interfeyslar — rollar mavjud bo'ladi. Rollar oz, lekin ularning kombinatsiyalari — klasslar juda ko'pdir.

Ma'nosi shundaki, senga har bir klass bilan alohida muloqot qilishning hojati yo'q. Ularning rollari (interfeyslari) bilan muloqot qilish kifoya.

O'zingizni robot-quruvchi deb tasavvur qilib ko'ring, va sizning qo'lingizda o'nlab robotlar bor, har biri bir nechta kasblarga ega bo'lishi mumkin. Devorni tezda tugatishingiz kerak. Siz faqatgina "quruvchi" qobiliyatiga ega robotlarni devor qurishga chaqirasiz. Sizga qanaqa robotlar ekanligi muhim emas. Agar u qura oladigan bo'lsa — yo'lida davom etsin.

Bu kodda qanday bo'lishi ko'rsatilgan:

Java Kodi Izoh
static interface WallBuilder {
    void buildWall();
}
— «devor quruvchi» qobiliyatiga mos keladi. «Devor qurish» buyrug'ini tushunadi — mos keluvchi metod mavjud.
static class IshchiRobot implements WallBuilder {
    public void buildWall() {
        …
    }
}
static class NazoratRobot implements WallBuilder {
    public void buildWall() {
        …
    }
}
static class SuvSepuvchi {
    …
}
— bu kasb/qobiliyatga ega robotlar.

— qulaylik uchun klasslarga ruscha nom qo'ydim. Java'da bunday qilish mumkin, lekin tavsiya etilmaydi.

— Suv Sepuvchi devor qurish qobiliyatiga ega emas (WallBuilder interfeysini amalga oshirmaydi).

public static void main(String[] args) {
    // barcha robotlarni ro'yxatga qo'shamiz
    ArrayList robots = new ArrayList(); 
    robots.add(new IshchiRobot());
    robots.add(new NazoratRobot());
    robots.add(new SuvSepuvchi());

    // devor qurish, agar bu qobiliyat mavjud bo'lsa
    for (Object robot: robots) {
        if (robot instanceof WallBuilder) {
            WallBuilder builder = (WallBuilder) robot;
            builder.buildWall();
        } 
    }
}
— ularga qanday qilib devorni qurishni buyurish kerak?

— Juda qiziq-ku. Interfeyslar bu qadar qiziqarli mavzu ekanini bilmasdim.

— Albatta! Polimorfizm bilan birlashtirilganida — bu haqiqiy bomba.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION