Gå til innhold

Forskjellen på et interface og en abstrakt klasse?


Anbefalte innlegg

Hallo, som topicen sier: hva er forskjellen på et interface og en abstrakt klasse?

 

Boka jeg leser i står det eksempel om en abstrakt klasse hvor de sier at en trekant, sirkel og firkant kan beregne arealet sitt, men har ulike fremgangsmåter å gjøre det på. Derfor kan man lage en abstrakt superklasse, Figur, som inneholder dette tomme metodehodet: finnAreal(). Hva med et interface da? Kan man ikke gjøre akkurat det samme med det?

 

Takker for svar! :)

Lenke til kommentar
Videoannonse
Annonse

Det er lite foreskjell mellom de to. En av forskjellene er jo selvsagt dette med multippel arv, som ikke er mulig. I tillegg er det slik at når man implementerer et interface, må man implementere samtlige metoder, men det trenger man ikke når man arver fra en abstract class.

 

I tillegg kan selvsagt en abstract class implementere metodekropper, i motsetning til interface, hvor man kun kan definere metodenavn, returtype og parametre.

 

 

Edit:

Med multiple inheritance mener jeg, hvis du ikke forstod det, at du bare kan arve fra én klasse, og hvis klassen din allerede arver fra en annen klasse, må du heller implementere et grensesnitt fremfor å arve fra en abstrakt klasse.

 

Edit2:

Bruk Interface med mindre du har grunn til noe annet.

 

Edit3:

Du kan ikke instansiere noen av dem.

Endret av pgd
Lenke til kommentar

Ok, skjønner, men hva er egentlig vitsen med å bruke abstrakte classer og interface? Er det bare på grunn av polymorfi eller er det rett og slett for å få mer orden i klassene dine ved å sette visse regler? I teorien er det jo bare å lage en haug med klasser med like metoder som arver en eller annen klasse som ikke har noen funksjonalitet i det hele tatt. :hmm:

Lenke til kommentar

Hvis man ønsker å ha en mengde forskjellige klasser som har helt forskjellige virkemåter, men du vil fremdeles bruke dem på samme måte, eller utføre samme handlinger på.

 

Best beskrevet med et eksempel. La oss si at vi vil ha en klasse. Samme hva den inneholder. Men vi ønsker å kunne sortere dem etter en bestemt rekkefølge. La oss, for eksempelets skyld, en klasse for personer, og vi vil sortere dem etter alder.

 

class Personer implements Comparable<Personer> {
  private int alder;
}

For at denne klassen skal kompilere, må vi lage en metode compareTo(Object o):

public int compareTo(Personer p) {
  return alder-p.alder;
}

 

Da kan vi be den statiske metoden sort() i Arrays sortere den, fordi den vet at klassen implementerer Comparable, og da vet den også at den kan sammenligne to personer.

 

Dårlig forklart, programmer, så lærer du.

Lenke til kommentar

Litt mer utfyllende om interface...

 

Et interface kan sammenliknes med en kontrakt. En klasse som implementerer et interface, garanterer at alle metodene som er deklarert i interfacet er implementert.

 

Selve implementasjonen av klassen kan variere, men så lenge den implementerer det samme interfacet, så kan du, som bruker av klassen, forvisse deg om at du ikke vil få noen feil når du kompilerer.

 

Kort sagt:

 

En klasse (spesielt abstrakte) definerer hva noe ER, mens et interface definerer hva noe GJØR!

 

Werner

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å
×
×
  • Opprett ny...