...
PlantUML Macro |
---|
interface "Iterable<T>" as iterable {
Iterator<T> iterator()
}
interface "Collection<T>" as collection
interface "List<T>" as list
class "ArrayList<T>" as arraylist
class "LinkedList<T>" as linkedlist
iterable <|-right-- collection
collection <|-right-- list
list <|.down. arraylist
list <|.down. linkedlist |
...
Siden Iterable er et vanlig grensesnitt, så kan våre egne klasser utvide den og utnytte den kompakte for-each-syntaksen. Anta f.eks. at en har en Library-klasse, som bruker en ArrayList til å holde Book-objekter. Kode for en slik klasse er vist under til venstre. Dersom denne klassen også implementerer Iterable<Book> så kan en bruke for-each-løkka for å gå gjennom Book-objektene i et Library-objekt. Koden og klassediagram for denne utvidete Library-klassen er vist i midten og for-each-løkka er vist til høyre.
Klasse som bruker ArrayList | Klasse som også implementerer Iterable | Klassediagram | for-each-løkke |
---|
Code Block |
---|
| public class Library {
private Collection<Book> books = new ArrayList<Book>();
public void addBook(Book book) {
books.add(book);
}
public void removeBook(Book book) {
books.remove(book);
}
} |
| Code Block |
---|
| public class Library implements Iterable<Book> {
... books-feltet og add- og remove-metodene her ...
// fra Iterable<Book>
public Iterator<Book> iterator() {
return books.iterator();
}
} |
| | "Iterable<T>"Iterable<Book> as iterable {
Iterator<T> iterator()
}
class Library
class Book
iterable <|.. Library
Library "1" *.right.. |
| Library
| Code Block |
---|
// lag en Library-instans
Library library = new Library();
// legg til noen bøker
library.addBook(new Book(...));
library.addBook(new Book(...));
// gå gjennom bøkene
for (Book book : library) {
// gjør noe med book her
...
} |
|
...