...
Noah har skrevet følgende kode for et Animal-grensesnitt med metoder som er generelle for alle dyr:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package interfaces; public interface Animal { public String getName(); public void setName(String name); public char getGender(); public void setGender(char gender); public boolean getCanSwim(); public void setCanSwim(boolean canSwim); } |
La oss si vi har tre klasser som implementerer Animal-grensesnittet: Dog, Elephant og Clownfish. Selve implementasjonen av disse kan du prøve på selv. Under tar vi for oss noen situasjoner der bruken av Animal-grensesnittet hjelper oss. Disse er forklart i kommentarene i koden.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package interfaces; import java.util.ArrayList; public class NoahsArkProgram { private ArrayList<Animal> ark; public void init() { // Initialiserer ark som en ArrayList med Animal-objekter. ark = new ArrayList<Animal>(); // De første tre dyrene som går på arken: // (Konstruktøren til hver tar inn hhv. name, gender og canSwim) Dog lassie = new Dog("Lassie", 'F', true); Elephant dumbo = new Elephant("Dumbo", 'M', false); Clownfish nemo = new Clownfish("Nemo", 'M', false); /* * Det går fint å legge til dyrene fordi alle implementerer * Animal-grensesnittet, selv om de er instanser av forskjellige * klasser, henholdsvis Dog, Elephant og Clownfish. */ ark.add(lassie); ark.add(dumbo); ark.add(nemo); } public void run() { /* * Siden alle elementene i ark-lista vår er implementasjoner av Animal, * så kan vi trygt bruke metodene som er definert i grensesnittet, uten * å vite noe om hvordan de faktisk er implementert i Dog-, Elephant- og * Clownfish-klassene. Vi trenger ikke vite hvilken type dyr vi kaller metodene * på - de er jo alle Animal-objekter. */ for (Animal animal : ark) { System.out.println(animal.getName()); System.out.println(animal.getGender()); System.out.println(animal.getCanSwim()); } /* * Hva om vi ønsker å vite hvilken klasse et Animal er? Er det Dog, * Elephant eller Clownfish? Dette kan gjøres ved å bruke * .getClass().getName(): */ for (Animal animal : ark) { System.out.println(animal.getClass().getName()); } /* * getClass kan vi også bruke til å sjekke om et dyr i arken er av en * gitt art. La oss si vi vil skrive ut navnet på alle hunder i arken: * (Merk at man må ha med pakkenavnet) */ for (Animal animal : ark) { if (animal.getClass().getName().equals("interfaces.Dog")) { System.out.println(animal.getName() + " is a dog! Bark bark!"); } } /* * Det samme kan også gjøres veldig enkelt ved å bruke instanceof: */ for (Animal animal : ark) { if (animal instanceof Dog) { System.out.println(animal.getName() + " is a dog! Bark bark!"); } } } public static void main(String[] args) { NoahsArkProgram program = new NoahsArkProgram(); program.init(); program.run(); } } |