Typecast class Pilz void suchen() void sammeln() class EßbarerPilz extends Pilz Suppe kochen() Suppe einesuppe = new Suppe(); return einesuppe; class GiftPilz extends Pilz void entsorgen() class Suppe public class ProgrammPilz public static void main(string[] args) Suppe einesuppe; Pilz einpilz = new EßbarerPilz(); // compiliert nicht: // einesuppe = einpilz.kochen(); // richtig: einesuppe = ((EßbarerPilz)einPilz).kochen(); einpilz = new GiftPilz(); // compiliert, aber Programmabbruch zur Laufzeit: einesuppe = ((EßbarerPilz)einPilz).kochen(); 5 1 generische Programmierung
abstrakte Klassen und Schnittstellen import java.security.invalidparameterexception; public class InterfaceBeispiel public static void main(string argv[]) Figure[] figurenfeld = new Figure[3]; figurenfeld[0] = new OnScreenCircle(4); figurenfeld[1] = new OnScreenRectangle(6, 9); figurenfeld[2] = new OnScreenCircle(3); for (int i = 0; i < figurenfeld.length; i++) ((Movable)figurenfeld[i]).move(5*i, 10*i); System.out.println( "Figurenfeld:" ); for (int i = 0; i < figurenfeld.length; i++) System.out.println( figurenfeld[i] ); System.out.println(); System.out.println( "Minimum: " + minimum(figurenfeld) ); System.out.println( "Maximum: " + maximum(figurenfeld) ); // Benutzung eines abstrakten Elementtyps static Comparable minimum(comparable[] feld) Comparable min = feld[0]; for (int i = 1; i < feld.length; i++) if ( min.compareto(feld[i]) > 0 ) min = feld[i]; return min; static Comparable maximum(comparable[] feld) Comparable max = feld[0]; for (int i = 1; i < feld.length; i++) if ( max.compareto(feld[i]) < 0 ) max = feld[i]; return max; 5 2 generische Programmierung
// abstrakte Klasse Figur // Benutzung einer Schnittstelle aus Paket java.lang abstract class Figure implements Comparable private static int counter = 0; private int idnumber; Figure() counter++; idnumber = counter; // zählt Anzahl der Figuren // eindeutig für jede Figur public int getidnumber() return idnumber; abstract double flächeninhalt(); // mit Implementierung // ohne Implementierung // Implementierung der Methode compareto aus Comparable public int compareto(object o) double a = flächeninhalt(), b = ((Figure)o).flächeninhalt(); if ( a < b ) return -1; if ( a > b ) return 1; return 0; // konkrete Klasse Rechteck class Rectangle extends Figure int länge, breite; Rectangle(int l, int b) if ( l < 0 b < 0 ) throw new InvalidParameterException(); länge = l; breite = b; // Implementierung der Methode flächeninhalt aus Figure double flächeninhalt() return länge * breite; return "Rechteck: Laenge " + länge + ", Breite " + breite; 5 3 generische Programmierung
// konkrete Klasse Kreis class Circle extends Figure int radius; Circle(int r) if ( r < 0 ) throw new InvalidParameterException(); radius = r; // Implementierung der Methode flächeninhalt aus Figure double flächeninhalt() return radius * radius * Math.PI; return "Kreis: Radius " + radius; // Definition einer eigenen Schnittstelle // bewegliche Objekte brauchen die Operation move interface Movable // Bildschirmauflösung 640 x 480 int MAX_X = 480, // Zeilen 0...479 MAX_Y = 640; // Spalten 0...639 boolean move(int dx, int dy); 5 4 generische Programmierung
class OnScreenRectangle extends Rectangle implements Movable int base_x, base_y; // Koordinaten der linken oberen Ecke //Rechteck sichtbar, wenn vollständig auf Bildschirm darstellbar boolean visible; OnScreenRectangle(int l, int b) super(l, b); visible = move(0, 0); // Implementierung der Methode move aus Movable public boolean move(int dx, int dy) base_x += dx; base_y += dy; if ( base_x < 0 base_y < 0 base_x + länge >= MAX_X base_y + breite >= MAX_Y ) return false; return true; return super.tostring() + ", x: " + base_x + ", y: " + base_y; class OnScreenCircle extends Circle implements Movable int base_x, base_y; // Koordinaten des Mittelpunktes //Kreis sichtbar, wenn vollständig auf Bildschirm darstellbar boolean visible; OnScreenCircle(int r) super(r); visible = move(0, 0); // Implementierung der Methode move aus Movable public boolean move(int dx, int dy) base_x += dx; base_y += dy; if ( base_x - radius < 0 base_y - radius < 0 base_x + radius >= MAX_X base_y + radius >= MAX_Y ) return false; return true; return super.tostring() + ", x: " + base_x + ", y: " + base_y; 5 5 generische Programmierung