Übung 8: Implementierung objektorientierter - ias.uni

Werbung
Universität Stuttgart
Institut für Automatisierungstechnik und Softwaresysteme
Prof. Dr.-Ing. M. Weyrich
Theorie zu Übung 8 „Implementierung in
Java“
Klasse in Java
 Die Klasse wird durch das class-Konzept realisiert
 Keine Trennung von Spezifikation und Implementierung der Klasse
 Klasse ist (abstrakter) Datentyp
class Zaehler{
int Zaehlerstand;
void inkrementieren()
{...}
void initialisieren()
{...}
int getZaehlerstand()
{...}
}
Objekt in Java
 Klassen werden wie Datentypen verwendet
 Objekte können nur dynamisch erzeugt werden
Zaehler einZaehler;
//Objektvariable
einZaehler = new Zaehler();
//einZaehler verweist auf neues
//Objekt der Klasse Zaehler
einZaehler = null;
//Referenz auf Objekt löschen,
//keine Speicherfreigabe erforderlich
Abstrakte Klasse in Java
 Kennzeichnung mit abstract
 Sobald eine Klasse eine abstrakte Operation besitzt muss sie als
abstract deklariert werden
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
abstract class Abstract1{
public void operation1()
{...}
public void operation2()
{...}
}
abstract class Abstract2{
public abstract void operation1();
...
}
Attribute und Operationen in Java
Sichtbarkeit:
 public – sichtbar für alle
 protected – im selben Paket für alle sichtbar, außerhalb nur für
Unterklassen sichtbar
 private – sichtbar innerhalb der Klasse
 Voreinstellung: im Paket für alle sichtbar, außerhalb unsichtbar für
alle
Parameterkonzept bei Operationen in Java:
 Primitive Typen: call by value, Ausgabe erfolgt nur über den
Ergebnistyp
 Objekttypen: call by reference
Konstruktoren in Java:
 Dienen zur Initialisierung von Objekten
 Mehrere Konstruktoren pro Klasse möglich
o Unterschiedliche Parameterlisten => overloading
 Keine Destruktoren in Java
o Speicherplatz-Freigabe durch garbage collector
52
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
class Kreis {
protected Punkt Mittelpunkt = new Punkt(1,1);
//Initialisierung
protected int Radius;
protected static int Anzahl;
//Klassenattribut
public Kreis(){}
//Konstruktor 1
public Kreis (int x, int y){
//Konstruktor 2
Mittelpunkt.setX(x);
Mittelpunkt.setY(y);
}
public void zeichnen() {...}
public static int getAnzahl() {...}
//Klassenoperation
}
Schnittstelle in Java
 Kann Konstanten und abstrakte Operationen enthalten
 Wird mit dem Schlüsselwort interface deklariert
 Wird von Klassen mit dem Schlüsselwort implements realisiert
interface ClassInfo {
public abstract String getClassName();
}
class MyClass implements ClassInfo{
public String getClassName(){
return "MyClass";
}
...
}
53
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
54
Beispiel:
public class VersicherungGUI {
Versicherung eineVersicherung;
public void init() {
// Es wird die Implementierung der
// Klasse Lebensversicherung verwendet
eineVersicherung = new Lebensversicherung();
...
}
public void ermittlePraemie() {
double VSumme = ...;
double Praemie =
eineVersicherung.berechnePraemie(VSumme);
...
}
VersicherungGUI
init()
ermittlePraemie()
public interface Versicherung {
//abstrakte Operation
public abstract double berechnePraemie
(double VSumme);
}
«interface»
Versicherung
berechnePraemie (double VSumme)
Aufruf
Lebensversicherung
Unfallversicherung
berechnePraemie (double VSumme)
berechneSonderpraemie(double VSumme)
berechnePraemie (double VSumme)
class Lebensversicherung implements Versicherung
{
//Impl. der (abstrakten) Operation mit switch
public double berechnePraemie(double VSumme)
{
double praemie = 0.0;
class Unfallversicherung implements Versicherung
{
// Impl. der (abstrakten) Operation mit if
public double berechnePraemie(double VSumme)
{
double praemie = 0.0;
int Schalter = (int)((VSumme-1.0/100.0) / 5000.0);
switch (Schalter) {
case 0: praemie = VSumme * 16.8 / 1000.0;
break;
case 1: praemie = VSumme * 12.6 / 1000.0;
if(VSumme > 10000.0)
praemie = VSumme * 8.4 / 1000.0;
else if (VSumme <= 5000.0)
praemie = VSumme * 16.8 / 1000.0;
else
praemie = VSumme * 12.6 / 1000.0;
return praemie;
break;
default: ...; break;
}
return praemie;
}
}
}
}
Assoziationen in Java
Abhängig von:
 Obergrenzen der Kardinalitäten (maximal 1 oder größer 1)
 Navigierbarkeit (unidirektional oder bidirektional)
Beispiel: Verwaltung
Kardinalität <= 1
einer
unidirektionalen
Assoziation
mit
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
KlasseA
KlasseB
0..1
eineRolleB: KlasseB
RolleB
setRolleB(KlasseB einObjektB)
getRolleB() : KlasseB
removeRolleB()
class KlasseA {
KlasseB eineRolleB;
//Referenz-Attribut
//Verwaltungsoperationen
public void setRolleB(KlasseB einObjektB) {
eineRolleB = einObjektB;
}
public KlasseB getRolleB() {return eineRolleB}
public removeRolleB() {eineRolleB = null}
}
Bei bidirektionalen
erforderlich!
Assoziationen
Beispiel: Verwaltung
Kardinalität >1
einer
Verwaltung
unidirektionalen
in
beiden
Klassen
Assoziation
mit
 Verwendung der Java-Containerklasse Vector mit Operationen
z.B. addElement(),
removeElement() und
elementAt()
Abteilung
*
Mitarbeiter
class Abteilung {
protected Vector Mitarbeiter;
public void setMitarbeiter (Angestellter ang){
Mitarbeiter.addElement (ang);
}
Angestellter getMitarbeiter (int pos) {
ang =(Angestellter)Mitarbeiter.elementAt(pos);
return ang;
}
void removeMitarbeiter (Angestellter ang) {
Mitarbeiter.removeElement (ang);
}
}
Angestellter
55
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
Polymorphismus
Operationen sind automatisch polymorph
 Nicht-polymorphe Operation muss explizit als final deklariert
werden
 Dann kann diese Operation nicht überschrieben werden
class Grafikobjekt {
public void zeichnen() { ... }
}
class Kreis extends Grafikobjekt {
public void zeichnen() { ... }
}
class Rechteck extends Grafikobjekt {
public void zeichnen() { ... }
}
Grafikobjekt eineGrafik;
eineGrafik = new Kreis();
eineGrafik.zeichnen();
//zeichnet Kreis
eineGrafik = new Rechteck();
eineGrafik.zeichnen();
//zeichnet Rechteck
Mehrfachverebung
 In Java ist Mehrfachvererbung für Klassen nicht realisiert.
 Statt dessen Schnittstellenkonzept
o Schnittstelle kann nur abstrakte Operationen und Konstanten
weitergeben
o Keine Attribute und Implementierungen von Operationen
 Mehrfachvererbung und Schnittstellen sind nicht gleichzusetzen!
class B1 { ... }
interface B2 { ...}
interface B3 { ...}
class D extends B1 implements B2, B3
{...}
56
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
57
Zustandsautomat in Java
Verschiedene Implementierungen möglich:
1. Implementierung mit Zustandsattribut (Aufzählungstyp)
 In Java existiert kein benutzerdefinierbarer Aufzählungstyp
 Lösung z.B. mit Integer Konstanten
class Schublade {
private int classState;
// Zustandsattribut speichert
// aktuellen Zustand
// mögliche Zustände
final static int OFFEN = 1;
final static int ZU_UNVERSCHLOSSEN= 2;
final static int ZU_VERSCHLOSSEN= 3;
public void oeffnen() {
// Jede Operation muss Zustandsattribut abfragen
if (classState == ZU_UNVERSCHLOSSEN
{
classState = OFFEN;
// Aktualisierung des
//Zustandsattributs, wenn mit
//der Operation ein
//Zustandswechsel verbunden ist
...
}
}
2. Überführung in Zustandsmuster => siehe Kapitel 6
3. Implementierung mit switch-case-Anweisung
Switch / While Idiom für Zustandsdiagramme
 Implementierungsmuster (Idiom) für Zustandsdiagramme
 Bildet Zustandsdiagramm in strukturierten Code nach einem
generischen Codemuster ab
 Gleiche Struktur im Zustandsdiagramm und Code
 Abbildung von entry, do und exit-Aktionen
 Abbildung hierarchischer Zustände
 Nachteil: Ereignisbasiert - keine Ausnutzung objektorientierter
Konzepte
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
Zustandsdiagramm:
Time Mode
entry:
do:
display time
exit:
button
pushed
button
pushed
Date Mode
entry:
do:
display date
exit:
Strukturiertes Programm in Pseudocode:
58
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
59
START
WHILE TRUE
SWITCH currentState
CASE time mode:
WHILE NOT button pushed
display time
ENDWHILE
currentState:= date mode
BREAK
CASE date mode:
WHILE NOT button pushed
display date
ENDWHILE
currentState:= time mode
BREAK
ENDSWITCH
ENDWHILE
END
Regeln des Idioms:

Abbildung Zustandsdiagramm in
o currentState variable
o While-Schleife mit switch-case
Grundgerüst, das alle Zustände als
einzelne Anweisungen enthält

Die Zustände, die Aktionen in einem
Zustand werden durch weitere whileSchleife implementiert.

Bei Verlassen eines Zustandes durch
einen Zustandsübergang wird die Variable
current State aktualisiert.

Realisierung hierarchischer Zustände
o Erzeugen eines switch / while
Blocks für jeden flachen Zustand
o Schachtelung
Zustandshierachie
START
WHILE TRUE
SWITCH currentState
CASE time mode:
WHILE NOT button pushed
display time
ENDWHILE
currentState := date
BREAK
CASE date mode:
WHILE NOT button pushed
display date
ENDWHILE
currentState := time
BREAK
ENDSWITCH
ENDWHILE
END
gemäß
Zusammenfassung
 Statisches Modell ist direkt in Java implementierbar
Grundlagen der Softwaretechnik
Übung 8: Implementierung in Java
 Bidirektionale Assoziationen benötigen Verwaltung in beiden
Klassen
 Zustandsautomaten
können
mit
Implementierungsstrategien implementiert werden
o Mit Zustandsattribut
o Mit Zustandsmuster
o Mit Switch-Case Anweisungen
(Hilfsmittel: Switch/While Idiom)
verschiedenen
60
Herunterladen