...
Code Block |
---|
package interfaces;
public interface StringGrid extends Iterable<String> {
public int getRowCount();
public int getColumnCount();
public String getElement(int row, int column);
public void setElement(int row, int column, String element);
} |
Legg merke til at StringGrid-grensesnittet arver fra (extends) Iterable<String>-klassen hvilket betyr at det skal være mulig å iterere over klassen ved å spørre Iterator-objektet om neste streng i rutenettetAlle klasser som implementerer StringGrid-grensesnittet må støtte de fire definerte metodene.
Del 1 - StringGrid-grensesnitt og implementerende StringGridImpl-klasse
Lag Lag en StringGridImpl-klasse som implementerer StringGrid-grensesnittet . Denne klassen må støtte alle metodene som er definert i grensesnittet i tillegg til metoden
Code Block |
---|
public Iterator<String> iterator() |
som returnerer et Iterator<String>-objekt som skal kunne spørres om neste streng i rutenettet for iterasjon. Du definert over. Du står fritt til å velge hvordan metodene definert av grensesnittet skal implementeres så lenge den tilfredsstiller den definerte oppførselen. To mulige løsninger for representasjon av rutenettet er en enkel ArrayList<String> eller en dobbel ArrayList<ArrayList<String>> der den ytre listen er radene og de indre kolonnene. Wikisiden om todimensjonale matriser kan være lurt å ta en titt på før du går i gang hvis du velger sistnevnte rutenettrepresentasjon. Dersom getElement(int, int)- eller setElement(int, int, String)-metodene kalles med ulovlige verdier for rad eller kolonne (i.e. de er utenfor rutenettet), skal en IllegalArgumentException kastes.
Del 2 - StringGridIterator-klasse
Iterator-objektet som returneres av iterator()-metoden i StringGridImpl-klassen itererer over StringGridImpl-klassen på én bestemt måte. Det er hensiktmessig å kunne iterere over et rutenett som implementerer grensesnittet StringGrid - f.eks. når en bygger en streng i en toString()-metode eller skal sjekke om et spill har blitt avsluttet / vunnet. For å kunne gjøre dette skal vi nå lage en iteratorklasse for StringGrid-grensesnitt, kalt StringGridIterator. Denne klassen må implementere grensesnittet Iterator<String>, ha et felt for et objekt av typen StringGrid og støtte metodene definert av grensesnittet ved å iterere gjennom dette objektet. For å kunne velge om en vil iterere over rutenettet bortover først (rowMajor=true) eller nedover først (rowMajor=false) skal du nå lage en StringGridIterator-klasse som implementerer grensesnittet Iterator<String>. Den må må du også ha et felt boolean rowMajor som holder styr på hvordan rutenettet skal itereres. StringGridIterator-klassen må altså støtte følgende konstruktør / metoder:
- StringGridIterator(StringGrid, boolean) - konstruktør som tar inn StringGrid-objektet som StringGridIterator-klassen skal iterere over i tillegg til en boolsk verdi som angir om iterasjonen skal være bortover først (rowMajor=true) eller nedover først (rowMajor=false).
boolean hasNext() - returnerer true så lenge det er flere strenger igjen i StringGrid-objektet som ikke enda er blitt iterert over (i.e. sjekk om du har kommet til siste rute i rutenettet).
String next() - returnerer den neste strengen i rutenettet. Hvilken streng som er den neste til å bli returnert avhenger av hvordan rutenettet skal itereres (i.e. om rowMajor=true eller rowMajor=false).
void remove() - denne metoden skal bare kaste et unntak av typen UnsupportedOperationException siden det ikke skal være mulig å fjerne strenger fra rutenettet.
Iterator-objektet som returneres av iterator()-metoden i StringGridImpl-klassen itererer over StringGridImpl-klassen på én bestemt måte.
Del 3 - StringGridIterable-grensesnitt og implementerende StringGridIterableImpl-klasse
Som en siste utvidelse, ønsker vi nå å gjøre StringGrid-grensesnittet itererbart. Ved å legge til extends Iterable<String> bak grensesnittnavnet StringGrid tvinger vi alle klasser som implementerer gresesnittet til også å være itererbare. Da skal det være mulig å iterere over implementerede klasse, f.eks. StringGridImpl-klassen du lagde i Del 1, ved å spørre Iterator-objektet om neste streng i rutenettet. Dette modifiserte grensesnittet (som arver fra Iterable<String>), kalt StringGridIterable, er vist i kodeblokken under:
Code Block |
---|
package interfaces;
public interface StringGridIterable extends Iterable<String> {
public int getRowCount();
public int getColumnCount();
public String getElement(int row, int column);
public void setElement(int row, int column, String element);
} |
Code Block |
---|
public Iterator<String> iterator() |
som returnerer et Iterator<String>-objekt som skal kunne spørres om neste streng i rutenettet for iterasjon.
...