Avatar billede boomshanka Nybegynder
04. juni 2003 - 22:52 Der er 8 kommentarer og
1 løsning

hvilke fordele/ulemper er der mellem interfaces og arv

Nedenstående eksempel er taget fra http://www.eksperten.dk/spm/75774 og omhandler bøger og skilte, som begge kan læses. Udfra eksemplet i ovenstående link er dette lavet med et interface (Læsbar):

class Bog implements Læsbar
{
....

String getTekst()
{
  Heri føres det læsbare materiale over i en string
}
....
}

class Skilt implements Læsbar
{
....

String getTekst()
{
  Heri føres det læsbare materiale over i en string
}
....
}


class Læser
{

  void læsNoget( Læsbar kilde )
  {
    String detLæste = kilde.getTekst();
  }

}
Men kunne man ikke sagtens løse samme problemstilling ved hjælp af arv? I det tilfælde kunne man bruge LæsbarObjekt som superklasse for subklasserne Bog og Skilt som beskrevet nedenfor:

class Bog extends LæsbarObjekt
{
....

String getTekst()
{
  Heri føres det læsbare materiale over i en string
}
....
}

class Skilt extends LæsbarObjekt
{
....

String getTekst()
{
  Heri føres det læsbare materiale over i en string
}
....
}


class Læser
{

  void læsNoget( LæsbarObjekt kilde )
  {
    String detLæste = kilde.getTekst();
  }

}

Udover at eksemplet med arv rent forståelsesmæssigt måske ikke er helt smart (valget af superklase til Skilt og Bog), hvad er så egentlig fordelen ved f.eks. at bruge arv i forhold til et interface? Har det noget med multibel arv at gøre?

Hvis det er tilfældet, hvad ville så være et konkret eksempel som fuldstændig udelukkede brugen af enten interface eller arv? På forhånd tak.
Avatar billede arne_v Ekspert
04. juni 2003 - 22:59 #1
Du skal kigge på hvad er virkeligheden bag det.

Et interface er en kontrakt hvor en klasse lover at implementere
nogle bestemte metoder.

Arv betyder at den afledte klasse er en specialisering af
basis klassen og at den arver egenskaber fra den.
Avatar billede arne_v Ekspert
04. juni 2003 - 23:01 #2
I ovenstående tilfælde vil jeg synes at man bedre kan argumentere for
at bog og skilt er nogen som kontraktligt har lovet at have en getTekst
metoden end at læsbart objekt er noget reelt som bog og skilt er en
udvidelse af.
Avatar billede arne_v Ekspert
04. juni 2003 - 23:04 #3
Hvis det derimod var bog, skønlitterær bog og fag bog så ligenede
det jo mere en udvidelse.
Avatar billede arne_v Ekspert
04. juni 2003 - 23:06 #4
Du kan også se det derved at bog og skilt ikke rigtigt har nogen
fælles egenskaber.

Det har skønlitterær bog og fag bog derimod.
Avatar billede boomshanka Nybegynder
04. juni 2003 - 23:15 #5
Okay, det vil sige at man sagtens kan anvende begge løsninger, men at interfaces vil være bedst i ovenstående tilfælde?

Jeg havde egentlig håbet at der var en afgørende kodemæssig forskel på disse to løsningsforslag - ikke at man blot skulle overveje hvad der designmæssigt beskrev det bedst.
Avatar billede boomshanka Nybegynder
04. juni 2003 - 23:20 #6
ikke at jeg mener at dit svar er forkert :)

men hvis man f.eks. havde et eksempel hvor brugen af interfaces eller arv var udelukket total.
Avatar billede arne_v Ekspert
04. juni 2003 - 23:20 #7
I vil opdage at det design der bedst modellerer virkeligheden også
normalt vil give den mest hensigtsmæssige kode.
Avatar billede arne_v Ekspert
04. juni 2003 - 23:26 #8
Et interface er reelt set arv fra en klasse med udelukkende abstrakte metoder.

Hvis der er mulighed for at ligge implementation i en basis klasse, fordi
der reelt er delte egenskaber, så er det meget bedre at bruge arv,
fordi man undgår at skulle duplikere funktionalitet.

Omvendt hvis der ikke er delte egenskaber så vil heg mene det er
kønnere at bruge et interface end arv fra en klasse med ene
abstrakte metoder (når nu Java har noget specielt for det).
Avatar billede boomshanka Nybegynder
04. juni 2003 - 23:34 #9
Det gav faktisk et ret godt indblik i forskellen mellem interfaces og arv. Mange tak for det!
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