Spring til indhold
Academi.dk

Objektorienteret programmering

Arv

Øvet DA↔EN-ordliste

Arv er, at en klasse bygger videre på en anden og får dens felter og metoder med. Du skriver extends efter klassenavnet, og kalder super i din constructor for at få den nedarvede opsætning kørt. Underklassen kan tilføje nyt og overskrive det, den vil gøre anderledes.

Forudsætter, at du har set klasser og objekter .

Det fælles ét sted

Har du to klasser, der ligner hinanden på det meste, skriver du ikke det fælles to gange. Du lægger det i en overklasse og lader begge arve fra den.

Eksempel
class Bruger {
constructor(navn, email) {
  this.navn = navn;
  this.email = email;
}

beskriv() {
  return this.navn + " (" + this.email + ")";
}
}

class Studerende extends Bruger {
constructor(navn, email, studienummer) {
  super(navn, email);
  this.studienummer = studienummer;
}

beskriv() {
  return super.beskriv() + ", studienr. " + this.studienummer;
}
}

const ida = new Studerende("Ida", "ida@example.dk", "s123456");
console.log(ida.beskriv());
console.log(ida.email);

Output

Tryk på “Kør koden”.
  • extends siger, at Studerende bygger videre på Bruger.
  • super(...) kalder overklassens constructor. Den skal stå først i underklassens constructor, før du rører this.
  • super.beskriv() kalder overklassens udgave af metoden, så du kan bygge videre på den i stedet for at skrive den om.

Overskrivning

Definerer underklassen en metode med samme navn, er det dens udgave, der bliver kaldt. Det er polymorfi: samme kald, forskelligt svar.

Eksempel
class Betaling {
gebyr() {
  return 0;
}
total(beloeb) {
  return beloeb + this.gebyr();
}
}

class Kortbetaling extends Betaling {
gebyr() {
  return 2;
}
}

class Faktura extends Betaling {
gebyr() {
  return 25;
}
}

for (const b of [new Betaling(), new Kortbetaling(), new Faktura()]) {
console.log(b.total(100));
}

Output

Tryk på “Kør koden”.

Bemærk, at total kun er skrevet ét sted, men bruger den gebyr, der hører til det konkrete objekt. Det er den egenskab, der gør arv nyttig, og det er præcis det eksempel, der efterspørges til eksamen.

Hvornår er arv den rigtige model?

Prøv sætningen: “en X er en Y”. En studerende er en bruger. Arv giver mening. En ordre er ikke en kunde, men den har en kunde, der skal du bruge et felt i stedet.

Det hedder is-a mod has-a, og den skelnen er selve svaret på det eksamensspørgsmål, der handler om, hvornår man skal bruge arv.

Hold hierarkiet fladt

To niveauer er næsten altid nok. Ved tre eller fire begynder to ting at ske:

  • Du kan ikke længere se, hvor en metode kommer fra, uden at åbne fire filer.
  • En ændring i toppen får uventede konsekvenser langt nede.

Har du brug for at kombinere flere adfærd, er det ofte bedre at lade en klasse indeholde et objekt end at arve fra det. I et studieprojekt bliver det sjældent et problem, men det er et godt svar at have klar, hvis censor spørger til ulemperne.

Kort opsamling

  • extends arver felter og metoder.
  • super(...) først i constructoren, super.metode() for at bygge videre.
  • Overskrivning giver polymorfi: samme kald, forskelligt svar.
  • Brug arv ved “er en”, felter ved “har en”.

Læs videre

Senest gennemgået .