JavaRush /Blog Jawa /Random-JV /Antarmuka kanggo wong sing "minat banget, nanging ora nge...
Lilly
tingkat
Москва

Antarmuka kanggo wong sing "minat banget, nanging ora ngerti apa-apa"

Diterbitake ing grup
Halo kabeh! Kiriman iki ditulis, tinimbang, kanggo wong-wong sing wis ndeleng lan malah ngrampungake sawetara masalah ing Antarmuka ing level 12 (level 2 saka Java Core), nanging isih mikir: "Dadi kenapa dibutuhake yen sampeyan isih kudu ngetrapake metode kasebut. ?” diumumake ing antarmuka??? Yaiku, ora nyuda jumlah kode !!!" . Aku ora mangu sing topik iki bakal dijamin ing ceramah sakteruse, lan makna sing luwih jero lan opsi kanggo nggunakake antarmuka bakal dicethakaké ana, nanging yen sampeyan pancen ora kepenak, mula sampeyan olèh. Wiwitane aku pengin nulis komentar, nanging aku ngerti yen komentar kasebut bakal dadi dawa banget, mula kene. Iki minangka artikel pisananku, aku nampa kritik sing cukup. Yen aku salah nang endi wae, mangga dibenerake. Dadi, kaya sing kita ngerti, nalika nggawe kelas kita dhewe, kita mung bisa entuk warisan saka siji kelas abstrak utawa non-abstrak . Nanging ing wektu sing padha, ing kelas kita bisa ngetrapake sawetara antarmuka sing cukup akeh . Nalika marisi, sampeyan kudu dipandu dening akal sehat lan isih nulis entitas sing gegandhengan karo keturunan sampeyan (kita ora bakal marisi kucing saka buldoser lan kosok balene). Kanthi antarmuka , logika rada beda: sing penting ing kene dudu "entitas" dhewe, nanging "katrampilan" utawa apa sing bisa ditindakake . Contone, kucing lan buldoser bisa pindhah ing papan. Yaiku, ing prinsip, dheweke bisa ngetrapake antarmuka CanMove utawa Moveable. Utawa wong lanang lan kucing. Loro-lorone bisa ngombe, nanging nindakake kanthi cara sing beda: wong ngombe teh utawa kopi saka cangkir, lan kucing ngombe banyu utawa susu saka mangkuk. Nanging umume, loro-lorone ngombe, mula saben wong bisa nggawe implementasine antarmuka CanDrink dhewe. Apa gunane iki kanggo kita? Mbayangno sing nggawe game. Ayo dadi ngomong sampeyan duwe lokasi: kali, karo bank-bank ing loro-lorone, lan banjur alas lan gunung. Macem-macem jinis makhluk urip ngaso ing pesisir. Dumadakan banjir nyedhaki. Saben uwong sing bisa mabur mabur adoh. Sing ora bisa mabur, nanging bisa mlayu, mlayu. Ana sing ngerti carane nglangi, mula dheweke ora peduli babagan banjir sampeyan (uga, utawa bisa nglangi ing dharat), sanajan sawetara wong bisa nyoba uwal (yen ngerti). Liyane, sedhih, bakal mati. Ayo dadi nyoba kanggo ngleksanakake iki. (Aja wedi karo akeh kode bebarengan =) Umume komentar) Apa kelas sing bisa kita butuhake? Ayo dadi miwiti karo kelas abstrak saka karakter utawa Unit beda (nuwun, Aku ora kuwat ing terminologi game, mbenerake kula yen aku salah). Ayo dadi kelas Unit . Kita bakal nganggep manawa kabeh unit bisa pindhah ing papan lan nggawe swara. Unit Kelas Abstrak :
// Абстрактный класс для всех юнитов
public static abstract class Unit {
    // Базовый метод движения.
    // По умолчанию (если не переопределено) будет у всех наследников.
    public void move (int x, int y) {
        System.out.println("Я ( " + getClassName() + " ) просто брожу по полю на " +
                           x + " метров вправо и " + y + " метров вперед");
    }

    // Абстрактный метод, который ДОЛЖЕН ПЕРЕОПРЕДЕЛИТЬ у себя
    // КАЖДЫЙ КЛАСС, унаследованный от Unit.
    public abstract void makeSound();

    // Вспомогательный метод получения имени класса
    // без всей лишней информации.
    public String getClassName() {
        return this.getClass().getSimpleName();
    }
}
Apa antarmuka ("katrampilan") sing dibutuhake unit kita? Dheweke bisa mlayu ( CanRun ), nglangi ( CanSwim ) utawa mabur ( CanFly ). Sawetara wong bisa uga duwe sawetara katrampilan bebarengan, dene sawetara wong sing apes bisa uga ora duwe.
// Интерфейсы. КАЖДЫЙ КЛАСС, "наследующий" Howой-то интерфейс,
// ДОЛЖЕН РЕАЛИЗОВАТЬ его у себя.
interface CanRun {
    void run(String action);
}
interface CanSwim {
    void swim();
}
interface CanFly {
    void fly();
}
Sabanjure kita nggawe kelas sing diwenehi warisan saka kelas Unit abstrak. Path bakal dadi kelas Manungsa :
// Человек НАСЛЕДУЕТ абстрактный класс Unit,
// а также РЕАЛИЗУЕТ интерфейсы CanRun, CanSwim
public static class Human extends Unit implements CanRun, CanSwim {
    // Переопределяем метод public void makeSound()
    // родительского абстрактного класса Unit
    @Override
    public void makeSound() {
        System.out.print("Йу-хуу! ");
    }

    // РЕАЛИЗУЕМ метод public void run(String action) интерфейса CanRun
    @Override
    public void run(String action) {
        System.out.println("Я ( " + this.getClassName() + " ) " + action +
                           " отсюда на двух ногах ");
    }

    // РЕАЛИЗУЕМ метод public void swim() интерфейса CanSwim
    @Override
    public void swim() {
        System.out.println("Я ( " + this.getClassName() + " ) " +
                           "с двумя руками и двумя ногами " +
                           "хорошо плаваю");
    }
}
Kelas manuk . Ya, aku ngerti yen ora ana manuk sing prasaja, nanging kanggo kesederhanaan, supaya mung manuk, aja digawe abstrak:
// Птица НАСЛЕДУЕТ абстрактный класс Unit,
// и РЕАЛИЗУЕТ интерфейс CanFly
public static class Bird extends Unit implements CanFly {
    // Переопределяем абстрактный метод public void makeSound()
    // родительского абстрактного класса Unit
    @Override
    public void makeSound() {
        System.out.print("Курлык! ");
    }

    // РЕАЛИЗУЕМ метод public void fly() интерфейса CanFly
    @Override
    public void fly() {
        System.out.println("Я ( " + this.getClassName() + " ) улетел отсюда");
    }
}
Saiki ayo nggawe kelas abstrak liyane Animals , sing bakal diwarisake saka Unit :
// Абстрактный класс Животных, НАСЛЕДУЕТ абстрактный класс Unit
public static abstract class Animal extends Unit {
    // тут могут быть Howие-то данные и/or методы
}
Lan wis dadi ahli warise Lamb ( Wedhus ):
// Баран НАСЛЕДУЕТ класс Animal,
// и РЕАЛИЗУЕТ интерфейс CanRun
public static class Sheep extends Animal implements CanRun {
    // Переопределяем абстрактный метод public void makeSound()
    // родительского абстрактного класса Unit
    @Override
    public void makeSound() {
        System.out.print("Беееее! ");
    }

    // РЕАЛИЗУЕМ метод public void run(String action) интерфейса CanRun
    @Override
    public void run(String action) {
        System.out.println("Я ( "+ this.getClassName() + " ) " + action +
                           " отсюда на четырёх копытах");
    }
}
lan Sloth ( Sloth ):
// Ленивец НАСЛЕДУЕТ класс Animal
// и внутри себя ПЕРЕОПРЕДЕЛЯЕТ метод
// void move(int x, int y) абстрактного класса Unit
public static class Sloth extends Animal {
    // Переопределяем абстрактный метод public void makeSound()
    // родительского абстрактного класса Unit
    @Override
    public void makeSound() {
        System.out.print("Зевает... ");
    }

	// Переопределяем метод public void move(int x, int y)
    // родительского абстрактного класса Unit
    @Override
    public void move(int x, int y) {
        System.out.println("Я ( "+ getClassName() + " ) очень медленный, поэтому " +
                           "переместился на " + (int)(x/12) + " вправо " +
                           "и на " + (int)(y/12) + " вперед");
    }
}
Cara pamindhahan (int x, int y) saka kelas Unit abstrak ora abstrak , supaya kita ora kudu ngalahake, nanging kita nindakake alon-alon kanggo Sloth. Saiki ayo pindhah menyang tumindak.
public static void main(String[] args) {
    // создаём список юнитов
    // и добавляем туда представителей разных классов
    List<Unit> units = new ArrayList<unit>();
    units.add(new Human());
    units.add(new Bird());
    units.add(new Sheep());
    units.add(new Sloth());

    // проходим в цикле по всем юнитам и вызываем метод move(int x, int y).
    // У всех, кроме ленивца, будет вызван метод базового класса.
    // У Ленивца будет вызван его переопределенный метод
    for (Unit unit : units) {
		// в самом начале ничего не происходит, юниты просто двигаются.
        unit.move((int)(Math.random()*50), (int)(Math.random()*50));
    }

    System.out.println("\n...Наводнение приближается....");
    int distanceOfFlood = (int)(Math.random()*1000); // Число от 0 до 1000
    System.out.println("...Наводнение на " + distanceOfFlood + " от берега...\n");

    // проходим в цикле по всем юнитам
    for (Unit unit : units) {
        unit.makeSound(); // у каждого юнита свой, переопределенный, звук
        // смотрим, кто что "умеет":
		// если юнит умеет летать
        if(unit instanceof CanFly)
            ((CanFly) unit).fly(); // проблем нет, улетает
        // если юнит не умеет летать, но умеет бегать
        else if(unit instanceof CanRun) {
			// смотрим на Howое расстояние разлилась вода
            if(distanceOfFlood < 400) {
				// если меньше 400 (условно метров)
                ((CanRun) unit).run("убежал"); // юнит убежал
            }
            else {
				// если больше 400, юнит безуспешно пытается убежать
                ((CanRun) unit).run("пытался убежать");
				// если юнит может не только бегать, но и плавать
                if (unit instanceof CanSwim) {
                    ((CanSwim) unit).swim(); // плывёт
                }
				// иначе умирает (он хотя бы пытался)
                else unitIsDead(unit);
            }
        }
		// если юнит не летает, не бегает, но может плавать
        else if (unit instanceof CanSwim)
            ((CanSwim) unit).swim(); // плывёт
        else
			// если юнит не умеет совсем ничего - грустненько :(
            unitIsDead(unit); // умирает

        System.out.println();
    }
}

public static void unitIsDead(Unit unit) {
    System.out.println("Извините, я ( " + unit.getClassName() + " ) умер");
}
Literal numerik 12, 50, 400 lan 1000 dijupuk langsung; liyane bisa ditemtokake, nanging muga-muga logika kasebut jelas. Dadi, kita bisa ndeleng, duwe kelas induk abstrak karo cara umum, kita ora kudu mikir apa kelas tartamtu iki utawa unit, nanging mung nelpon cara iki (makeSound () lan pamindhahan ( ) ) . Sawise pass pisanan ing daur ulang, nalika pamindhahan () cara disebut ing kabeh Unit , ing ngisor iki bakal ditampilake ing layar: Antarmuka kanggo wong sing "minat banget, nanging ora ngerti apa-apa" - 1 Temenan, kabeh obyek kajaba sloth nampilake pesen standar saka pamindhahan () cara saka tuwane abstrak. kelas Unit , lan sloth wis pamindhahan (cara) wis redefined . Nanging, kelas abstrak ora bakal mbantu kita ngerteni apa sing "bisa ditindakake" unit tartamtu. Iki ngendi antarmuka teka menyang muter . Nggunakake instanceof , kita mangerteni apa unit iki bisa nindakake tumindak tartamtu ( apa ndhukung antarmuka kita kudu ), lan yen mangkono, kita nggunakake jinis casting sing wis menowo kanggo kita, contone, nggunakake ((CanFly) unit). fly () kita matak Unit jinis obyek kanggo jinis antarmuka CanFly lan nelpon cara fly () sawijining . Lan ora ketompo apa kelas obyek kita, mung sing penting yaiku dheweke nuduhake kemampuan kanggo mabur ing "resume". Kita kandha marang dheweke: "Sampeyan ngerti carane, mula mabur! Kita ora peduli kepiye sampeyan nindakake . " Sing, kanggo kita, minangka pangembang, iki tegese kelas sing ngleksanakake antarmuka CanFly bisa ngganti implementasine saka fly () cara ing sembarang wektu lan ing sembarang cara , kelas anyar sing ngleksanakake bisa katon, utawa, Kosok baline, pangembang bisa. mbusak sawetara saka kelas lawas. Nanging anggere cara iki nindakake fungsi kasebut lan obyek kasebut mabur, kita ora peduli. Kode kita sing bisa digunakake karo obyek sing ngetrapake antarmuka iki bakal tetep padha; kita ora kudu ngganti apa-apa. Sawise siklus kapindho, nalika kabeh wong nyoba uwal, gumantung saka ukuran banjir, kita bakal weruh ing layar utawa Antarmuka kanggo wong sing "minat banget, nanging ora ngerti apa-apa" - 2 Tanpa Antarmuka kanggo wong sing "kasengsem banget, nanging ora ngerti apa-apa" - 3 antarmuka, kita kudu mriksa saben obyek kanggo selaras karo kelas tartamtu (lan kita bakal duwe kanggo mriksa kabeh) lan elinga katrampilan saben kelas tartamtu. Tegese, ana wedhus ing ngarep kita saiki lan kayane ngerti carane mlayu. Apa yen sampeyan duwe sawetara rolas utawa atusan macem-macem jinis (kelas) karakter kasebut? Lan apa yen dudu sampeyan sing nulis, nanging programer liyane, mula sampeyan ora ngerti sapa sing bisa nindakake? Iku bakal luwih angel ... Lan tambahan cilik sawise publikasi: Ing urip nyata, sampeyan ora mung siji sing nggarap proyek. Ayo ngomong sampeyan mung nindakake logika. Kabeh obyek sing sampeyan sesambungan ditulis dening programer liyane. Sampeyan bisa uga ora ngerti kabeh kelas kode sampeyan bisa digunakake. Kabeh sing sampeyan butuhake yaiku nindakake apa sing sampeyan butuhake. Nanging, kabeh bisa nindakake iki kanthi cara sing beda-beda. Nanging, ayo ngomong, ing kode sampeyan nggawe metode sing mung bisa digunakake karo obyek kelas sing ndhukung antarmuka tartamtu
void doSomething(CanFly f)
sing, sampeyan nyetel antarmuka nggunakake parameter cara. Ora kelas konkrit, nanging antarmuka. Lan kabeh programer liyane, nalika nelpon metode doSomething(CanFly) sing ora sah iki, kudu dadi argumen minangka obyek sing jelas saka kelas sing ngetrapake CanFly, utawa sawetara obyek saka sawetara kelas sing bisa dilebokake:
Object obj = new Bird();
doSomething(obj); // ошибка компиляции Object cannot be converted to CanFly
doSomething((CanFly) obj); // нет ошибки, потому что obj у нас класса Bird и реализует CanFly

Bird b = new Bird();
doSomething(b); // нет ошибки

Human h = new Human() ;
doSomething(h); // ошибка компиляции
doSomething((CanFly) h); // ошибка времени выполнения ClassCastException
Iki carane antarmuka bisa migunani. Lan iki ora kabeh kemampuan lan cara aplikasi. Kita bakal sinau luwih akeh mengko ing kursus =) Matur nuwun kanggo maca nganti pungkasan =)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION