La oss forestille oss Noahs ark som en stack. Altså det første dyret som går inn i arken er det siste som kommer ut. Noah vil at arken skal støtte alle dyrearter, og han vil ha oversikt over hvilke av dyrene som ikke kan svømme, slik at han kan plassere dem nærmest livbåtene. Alle livbåtene er plassert fremst i båten, og dyrene går på bak. De som ikke kan svømme må altså gå på båten først.

Noah har skrevet følgende kode for et Animal-grensesnitt med metoder som er generelle for alle dyr:

 

Animal.java
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.

NoahsArkProgram.java
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', true);


		/*
		 * 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();
	}
}

 

 

  • No labels