Avatar billede langkiller Nybegynder
17. juni 2013 - 21:35 Der er 14 kommentarer og
1 løsning

Hvorfor bruge interfaces i java

Jeg er meget i tvivl om hvorfor man bruger interfaces. Hvad er det smarte ved dem?

SÅ vidt jeg har forstået, deklarerer de bare nogle metoder der skal bruges. De implementeres først af den klasse der implementere interfacen.. Så jeg kunne gøre præcis det samme uden at bruge/implentere en interface.
Interfacen kræver endda at man implementerer alle dens metoder hvis man vil bruge den.. hvorfor?

Har prøvet at lave et lille kode eksempel her, men kan stadig ikke få det til at give mening:

Interface:
public interface InterfaceTest {
    public void setSize(int size);
    public int getSize();
}

Klasse der implementerer interface:
public class TestInterface1 implements InterfaceTest {

    int size = 0;
   
    public void setSize(int size) {
        this.size = size;
    }

    public int getSize() {
        return this.size;
    }

}

Main klasse:

public class MainInterfaces {

    public static void main(String[] args) {
        TestInterface1 testInterface1 = new TestInterface1();
        testInterface1.setSize(222);
        System.out.println(testInterface1.getSize());
    }

}


Så jeg kunne jo tydeligvis bare droppe min interface og stadig få samme resultat.. Forstår virkelig ikke hvad pointen er.
Avatar billede arne_v Ekspert
17. juni 2013 - 21:54 #1
Daarligt eksempel.

TestInterface1 testInterface1 = new TestInterface1();

er uheldigt - du skal bruger:

InterfaceTest testInterface1 = new TestInterface1();
Avatar billede arne_v Ekspert
17. juni 2013 - 21:56 #2
Formaalet er at afkoble interface og implementation.

Naar du bruger InterfaceTest opererer du paa "et eller andet som implementerer interface InterfaceTest" og du kan bruge den kode med forskellige implementationer.
Avatar billede arne_v Ekspert
17. juni 2013 - 21:58 #3
Og det bliver rigtigt interessant, hvis det er en udvikler som definerer interfacet og noget kode som opererer paa det, mens det er en anden udvikler som laver den implementerende klasse og kalder den foerste udviklers kode.
Avatar billede langkiller Nybegynder
17. juni 2013 - 22:04 #4
Men jeg forstår stadig ikke interfacet's rolle.. Man kan jo stadig gøre præcis det samme bare ved at bruge klassen TestInterface1 ?
Avatar billede arne_v Ekspert
17. juni 2013 - 22:08 #5
Ja.

Men overvej hvor mange steder du skal rette i koden hvis du vil bruge TestInterface2 fremfor TestInterface1.
Avatar billede langkiller Nybegynder
17. juni 2013 - 22:11 #6
Nu ved jeg ikke om det bare er mig der er tungnem her, men hvordan kan en interface sørge for at man ikke skal rette så mange steder? Det eneste en interface gør, er jo at deklarerer metoder, som alle sammen skal implementeres af den klasse der implementere interfacen
Avatar billede arne_v Ekspert
17. juni 2013 - 22:24 #7
proev og kig paa den her aendring af din kode:

public class MainInterfaces {
    public static void foo(InterfaceTest o) {
        o.setSize(222);
    }
    public static void bar(InterfaceTest o) {
        System.out.println(o.getSize());
    }
    public static void main(String[] args) {
        InterfaceTest o = new TestInterface1();
        foo(o);
        bar(o);
    }
}

ved at rette:

new TestInterface1()

til:

new TestInterface2()

saa bruger du en anden implementation fordi alle de andre steder bruger du InterfaceTest.
Avatar billede langkiller Nybegynder
17. juni 2013 - 22:50 #8
okay forstår godt de eksempel efter at have kigget lidt på det.. men  hvordan kan det være nyttigt at skifte til en anden implementation? Hvorfor skulle man gøre det ?

Hvordan ville du egentlig definere en interface ? tror det ville hjælpe mig til at forstå det bedre.
Avatar billede lclemens Nybegynder
17. juni 2013 - 23:03 #9
Lad os sige, du vil lave et gui til et antal videoafspillere. Så laver du et interface med de metoder, som de skal have tilfælles ... play, pause, spol, stop, etc.

Nu kan du tilgå x antal implementationer via et enkelt interface.
Avatar billede arne_v Ekspert
18. juni 2013 - 00:10 #10
Du har tit brug for at skifte noget implementation.

I.s.f. at gemme noget data i XML fil vil du gemme det i database.

Noget business logic for transaktioner i en valuta skal erstattes af transaktioner i flere valuta for halvdelen af kunderne.
Avatar billede fsconsult.dk Nybegynder
18. juni 2013 - 07:10 #11
Det er også særdeles praktisk ifm. unit-tests.

Hvis du skal teste et modul, som benytter InterfaceTest, men ikke ønsker at kalde den faktiske kode (fordi den f.eks. opdaterer databasen, eller kalder EJB eller andet, som ikke er praktisk under en unit-test).

I dette tilfælde kan du give dit modul en mock/test udgave af samme interface, som blot returnerer nogle mere eller mindre statiske data.

Generelt bruges interfaces til afkobling mellem forskellige kodedele.
Avatar billede langkiller Nybegynder
19. juni 2013 - 11:55 #12
tak for de gode svar :)

Funderede også lidt over noget andet: En interface er en abstract klasse ikke (har jeg i hvert fald læst)? Hvis ja, hvad betyder det sådan helt præcist ?
Avatar billede arne_v Ekspert
19. juni 2013 - 13:57 #13
I Java er et interface en selvstaendig kategori.

Men i f.eks. C++ er et interface bare en abstrake klasse hvor *alle* metoder er abstrakte.

Og det er reelt det samme.
Avatar billede langkiller Nybegynder
19. juni 2013 - 16:47 #14
Okay. så siger jeg tak for hjælpen! :)

Dem der gerne vil have points, kan jo smide svar
Avatar billede arne_v Ekspert
20. juni 2013 - 01:17 #15
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester