B-59 Abstrakte Methoden und Klassen Abstrakte Methode: Spezifikation einer Methode ohne ihre Implementierung; d. h. nur Name, Ergebnistyp und Parametertypen (Signatur der Methode). Sie muß in jeder Unterklasse implementiert werden. Abstrakte Klasse: Eine Klasse, die abstrakte Methoden hat (neben implementierten). Zu abstrakten Klassen kann man keine Objekte bilden - nur zu ihren Unterklassen. Zweck: Eine allgemeine Aufgabe (z. B. Fläche berechnen) wird in der Oberklasse spezifiziert und in den Unterklassen unterschiedlich implementiert: abstract class Geometrics { ... abstract double area (); ... } class Circles extends Geometrics { ... double area () { return Math.PI*radius*radius; } ... } g.area() kann für eine Variable g vom Typ Geometrics aufgerufen werden; dynamische Methodenbindung findet die zum Objekt passende Implementierung. Abstrakte Klassen liegen in der Vererbungshierarchie (Interfaces liegen daneben). Abstrakte Klassen können auch implementierte Methoden und Objektvariable haben (anders als Interfaces). Vorlesung Informatik B SS 98 / Folie 59 ! " # $ % ' ( ) & * + , - - & 5 . / 0 1 & 2 3 / 0 6 4 6 8 9 * 7 % * 7 : * ) ; < = > % ! > : ? B-60 Graphische Benutzungsoberflächen (GUI) Das Abstract Windowing Toolkit (Package java.awt) vereinfacht die Programmierung von GUIs. Es enthält Klassen zum Zeichnen graphischer Elemente, GUI-Komponenten, GUI-Layout, Ereignisbehandlung (event handlers). Übersicht: Component Container Panel Window Frame Scrollpane Button ... Label Interface Dialog LayoutManager FileDialog Graphics Rectangle Flow Border Grid Color Event ... ... Vorlesung Informatik B SS 98 / Folie 60 " % ( & A * B + , - @ 5 3 / C 1 % & 2 C D / 6 4 6 C 8 9 * 7 * 7 * - & : ; : B-61 Ein einfaches Programmschema import java.awt.*; // Hauptklasse als Unterklasse von Frame: public class GraphicWarning extends Frame { static private final int line = 15; // zur Positionierung von Texten static private final int letter = 5; public GraphicWarning (String title) // Konstruktor { super (title); // Aufruf des Konstruktors von Frame setBackground (Color.cyan); setForeground (Color.black); } public void paint (Graphics g) // überschreibt paint in Oberklasse { // auf der Fläche g können wir zeichnen und schreiben: g.drawRect (2*letter, 2*line, 33*letter, 6*line); g.drawString ("W A R N I N G", 9*letter, 4*line); ... } public static void main (String[] args) { Frame f = new GraphicWarning ("Draw Warning"); // Objekt erzeugen f.pack (); f.setSize (50*letter,10*line); // Größe festlegen f.setVisible (true); // führt zu erstem Aufruf von paint ... } } Vorlesung Informatik B SS 98 / Folie 61 * A ) B + , - E % ) B # - & 3 5 / 2 1 & 2 C D / 6 4 6 E 2 * F 7 * % G ! ! : 2 8 9 7 * H B ! I % % # J ! / B-62 Reaktionen auf Ereignisse An GUI-Komponenten können Ereignisse (events) eintreten, z. B. am Fenster „SchließenKnopf gedrückt“. Der GUI-Komponente werden Objekte (von Listener-Klassen) zugeordnet, die Methoden haben, um darauf zu reagieren (call-back-Methoden). WindowAdapter ist eine abstrakte Klasse, die das Interface WindowListener implementiert. Ihre Methoden verursachen nur leere Reaktionen, wenn sie nicht überschrieben werden. Beispiel: Eine Klasse, mit der beim Schließen des Fensters das Programm beendet wird: class Xclose extends WindowAdapter { public void windowClosing (WindowEvent e) { System.exit (0); } } Am Ende von main wird ein Objekt dieser Klasse der GUI-Komponente f zugeordnet: f.addWindowListener (new Xclose ()); Kompakter mit Sprachkonstrukt anonyme Klasse: namenlose Unterklasse, zu der es nur ein einziges Objekt gibt; Klassendeklaration mit new-Operation kombiniert (Java 1.1): f.addWindowListener ( new WindowAdapter () { public void windowClosing (WindowEvent e) { System.exit (0); } } ); Vorlesung Informatik B SS 98 / Folie 62 : K % # A ; : K B # L M ! : B * + , - - & 5 3 / 2 1 & 2 C D / 6 2 4 6 * 7 * % > 8 9 7 * ; ; $ ; % ! ) N '