Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

I praksis er det ofte enklest å beskrive oppførselen med et kode-eksempel med konkrete verdier:, som vist under. Dette er spesielt nyttig når en ønsker å teste om oppførselen er korrekt implementert.

Code Block
Counter counter = ... // getCounter() => 1
counter.count(); // getCounter() => 2
counter.count(); // getCounter() => 3 osv.

Person p = ...
p.setName("Hallvard"); // getName() => "Hallvard"

...

Alle objekter/klasser har altså et grensesnitt, som er de offentlig kjente operasjonene som tilbys andre objekter/klasser og den oppførselen som objektet implementerer og tilbyr andre objekter/klasser gjennom offentlig kjente operasjoner.

 

disse implementerer. Dette grensesnittet kan det være nyttig å gjøre eksplisitt, uavhengig av om det er implementert (ennå i noen spesifikk klasse). For det første er det jo dette andre klasser er interessert i og som disse må kode mot. Ved å gjøre grensesnittet eksplisitt kan en ta det i bruk uavhengig av og kanskje før implementasjonen er klar. For det andre fungerer grensesnittet og spesielt beskrivelsen av oppførselen som en spesifikasjon for implementasjonen, og den er det alltid greit å ha klar på forhånd før en begynner på implementasjonen. For det tredje kan det være aktuelt med flere implementasjoner, med ulike egenskaper og variasjoner innenfor rammen av den foreskrevne oppførselen.

PlantUML Macro
interface Counter {
	int getCounter()
	void count()
}
class CounterImpl {
	CounterImpl(int start, int end)
}
Counter <|--.. CounterImpl
PlantUML Macro
interface Counter {
	int getCounter()
	void count()
}
class UpCounter {
	UpCounter(int start, int end)
}
class DownCounter {
	DownCounter(int end, int start)
}
Counter <|--.. UpCounter
Counter <|.. DownCounter

Figuren over viser hvordan forholdet mellom et (eksplisitt) grensesnitt og en klasse som implementerer grensesnittet illustreres. Til venstre vises hvordan Counter-

...

grensesnittet er implementert av CounterImpl-klassen. Til høyre vises hvordan to ulike klasser kan implementere samme grensesnitt, og navnene indikerer at de representerer ulike varianter av en overordnet oppførsel, nemlig å telle fra et tall (i retning av og) til et annet.

Merk at det i dette tilfellet er viktig at de to klassene ikke bare har de nødvendige metodene, men implementerer oppførselen i henhold til kravene. 

Spørsmål til refleksjon

  • Prøv å beskrive grensesnittet til en stabel (eng: stack), med metodene push(), peek(), pop() og isEmpty()

...