Gå til innhold

Hva brukes et interface til?


Anbefalte innlegg

Hei. Leste nettop i en bok om interface i Java. Det jeg stusset litt på var at de ikke sa noe om hva det var godt for. Det sto noe med at det var en samling metodehoder, men det hjalp meg ikke særlig. Så spørsmålet blir da: Hva er et interface og hva kan man bruke interfacet til? Kom gjerne med små eksempler!

 

Takker på forhånd :)

Endret av kjey
Lenke til kommentar
Videoannonse
Annonse

Oj. Dette er et ganske omfattende spørsmål, og jeg anbefaler at du søker på nett/leser alternative bøker om det. Men...

 

Et interface brukes til å skjule implementasjonen av et stykke funksjonalitet. Hvis du f.eks. har et objekt du ønsker å lagre og hente opp igjen kan du lage et interface som definerer denne oppførselen uten å si noe om hvordan og hvor objektet lagres og hentes. Dermed kan du lage flere alternative implementasjoner, f.eks. én som lagrer til fil, én som lagrer til database eller én som enkelt bare er en dummy og lagrer objektet i minnet på maskinen. Så hvis du da ønsker å endre hvor/hvordan objektet blir lagret trenger du bare å velge implementasjon til interfacet ditt, og all annen kode forblir uberørt. Det er her altså snakk om å skrive ortogonal kode, dvs kode som er uavhengig av annen kode og som ikke bryr seg om hvordan noe er implementert. Interface handler altså om å lage en kontrakt som flere implementasjoner kan oppfylle uten å avsløre hvordan kontrakten oppfylles.

 

Vi har et interface:

 

public interface Lager
{
   void lagreObjekt( Object o );

   Object henteObjekt();
}

 

Så har vi flere implementasjoner av interfacet:

 

public class FilLager implements Lager
{
   public void lagreObjekt( Object o )
   {
       // Lagre objekt til fil
   }

   public Object henteObjekt()
   {
       // Hente objekt fra fil
   }
}

 

OK, denne implementasjonen blir litt banal, men det er greit:

 

public class MinneLager implements Lager
{
   private Object o;

   public void lagreObjekt( Object o )
   {
       this.o = o;
   }

   public Object henteObjekt()
   {
       return o;
   }
}

 

Så kan du der du ønsker å bruke dette si:

 

   ....

   Object o = new Obect();

   Lager lager = new MinneLager(); // eller new FilLager();

   lager.lagreObjekt( o );

   o = lager.henteObjekt();

   ....

 

Du kan altså ved å endre new XXXLager() bestemme hvilken implementasjon av Lager du ønsker å bruke, uten å endre noe annet i koden din. Koden trenger heller ikke å bry seg om hvor eller hvordan objektet lagres siden det er gjemt bak interfacet---så lenge alle implementasjoner av interfacet oppfyller kontrakten interfacet definerer, selfølgelig, men det er et krav. Koden henvender seg altså hele tiden mot interfacet, ikke mot implementasjonen, selv om det er implementasjonen som ligger bak og utfører oppgavene (referansen som brukes er av type Lager, men referansen peker til et objekt av type MinneLager).

 

I større systemer brukes kontainere hvor man konfigurerer i f.eks. xml hvilke implementasjoner som skal brukes rundt om kring, slik at man kan endre konfigurasjon/bruk av implementasjoner uten å måtte rekompilere hele systemet. Man har altså noe slikt:

 

public class JegBrukerLager
{
   private Lager lager;

   public void setLager( Lager lager )
   {
       this.lager = lager;
   }

   public void kjør()
   {
       Object o = new Object();

       lager.lagreObjekt( o );

       o = lager.henteObjekt();
   }
}

 

Her må altså referansen til Lager-implementasjonen som skal brukes settes utenifra et sted, før man kaller på kjør(). Men på denne måten blir JegBrukerLager-objektet KOMPLETT uvitende om hvilken implementasjon som brukes, og den er ikke interessert i å vite det heller. Altså, endres implementasjonen av Lager eller byttes ut, trenger man ikke å endre eller rekompilere JegBrukerLager i det hele tatt.

 

Et annet eksempel finner vi i Java-APIet hvor vi har interfacet List samt flere ulike implementasjoner av det, bl.a. ArrayList og LinkedList. Hvis du da i koden din hele tiden bruker en referanse av type List kan du enkelt på ett sted velge hvilken implementasjon av List du ønsker å bruke, typisk den som er mest effektiv ut ifra hvordan du bruker listen.

Endret av balletryne
Lenke til kommentar
Hei. Leste nettop i en bok om interface i Java. Det jeg stusset litt på var at de ikke sa noe om hva det var godt for. Det sto noe med at det var en samling metodehoder, men det hjalp meg ikke særlig. Så spørsmålet blir da: Hva er et interface og hva kan man bruke interfacet til? Kom gjerne med små eksempler!

 

Takker på forhånd  :)

6443658[/snapback]

 

Det funker ganske OK til å filtrere ut n00ber. Tenk deg følgende jobbintervju:

Sjef: "kan du forklare hva et interface er?"

n00b: "uuiiihhh.."

Lenke til kommentar

Et interface er en samling med abstrakte metoder og hver klasse som implementerer et interface sier ja til å implementere alle metodene i et interface med mindre det er en abstrakt klasse som implementerer interfacet. Dersom dette skulle være saken må subklassene implementere dette interfacet.

 

Et interface brukes for multippel arv og polymorfi. Hvis det opprettes et interface vil det gi en klasse ekstra funksjonalitet.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...