...
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.
|
|
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()
...