Klasse Konto erzeugt Objekte vom Typ Konto mit gleichen Eigenschaften mit gleichen Fähigkeiten Welche Eigenschaften hat ein Konto? Attribute Datenfelder - Konto hat eine Nummer - Konto hat Inhaber - Konto hat Kontostand - Konto benötigt PIN - Konto hat einen Dispokredit - Was kann ein Konto? Fähigkeiten Methoden - PIN prüfen - Aktuellen Kontostand liefern - Geldbetrag einzahlen - Geldbetrag abheben - Geldbetrag auf anderes Konto überweisen - 2
Welche Eigenschaften hat ein Konto? Attribute Datenfelder - int kontonr - String inhaber - int kontostand - int pin - int dispo - Datentypen Was kann ein Konto? Fähigkeiten Methoden - pruefepin() - gibkontostand() - einzahlen() - abheben() - ueberweisen() - Ein neues Konto anlegen Ein Konstruktor ist eine Methode der Klasse. Sie hat keinen Rückgabetyp, da ihr Ergebnis immer ein neues Objekt (Instanz) der Klasse ist. 1. Konstruktor ohne Parameterliste nur ein ganz bestimmtes Konto möglich public Konto () {knr=1234; inhaber = ; } 3
Ein neues Konto anlegen Ein Konstruktor setzt das Objekt in einen gültigen Anfangszustand- er initialisiert ein Objekt. 2. Konstruktor mit Parameterliste Attributwerte werden jedem Konto individuell zugewiesen public Konto(int knr, int name, ) {knr=knr; inhaber=name; } Methoden beschreiben die Fähigkeiten Verändernde Methode: ändert Zustand des Objekts public void einzahlen(int betrag) { Kontostand=kontostand+betrag; } Rückgabetyp leer Sondierende Methode: liest Attributwerte aus public int gibkontostand() { return kontostand; } Rückgabetyp des Datenfeldes 4
Methoden des Kontos Sondierende Methoden: - gibkontostand () - gibkontonr () - gibinhaber () - pruefepin (int pin) public rückgabetyp int String String boolean Methoden des Kontos Verändernde Methoden: public void -sperrekonto() -einzahlen() -abheben() -ueberweisen() -druckeauszug() 5
UML Konto Klassenname +kontonr :String +inhaber :String Datenfelder mit - kontostand :int (oder double) Sichtbarkeit - dispo :int (oder double) - pin :int - pintest :boolean - versuche :int + pruefepin(int pineingabe) :boolean + sperrekonto() :void + einzahlen(int betrag) :void + abheben(int betrag, int pin) Methoden :void + ueberweisen(int betrag, int pin, Konto empfaenger) :void + druckeauszug(int pin) :void Bedingungen in den Methoden 1. Alle Vorgänge - außer einzahlen() - werden nur nach erfolgreicher PIN-Prüfung ausgeführt. 2. Wird die PIN 3 - mal hintereinander falsch eingegeben, wird das Konto gesperrt und die PIN auf 0 gesetzt. 3. Es können nur positive Beträge abgehoben, eingezahlt und überwiesen werden. 4. Es können nur Beträge bis max. 1500 abgehoben werden. 5. Überweisen und abheben erfolgt nur bis zur Höhe des Dispokredits.(Überziehungsrahmen des Kontos) 6
Interne und externe Methoden Warum werden sie verwendet? zur besseren Strukturierung des Quelltextes (Modularisierung) zum Vermeiden von sich wiederholenden Quelltextstellen um Zugriff auf Methoden und Daten von Instanzen der eigenen Klasse oder anderer Klassen zu haben z.b. die wiederholte Pinprüfung vereinfachen, Überweisung zwischen zwei Instanzen Interne und externe Methoden Methoden können andere Methoden der eigenen Klasse als Teil ihrer Implementierung aufrufen. Dies wird als interner Methodenaufruf bezeichnet. Methoden von Objekten anderer Klassen mit Hilfe des Punkt- Operators aufrufen. Dies wird als externer Methodenaufruf bezeichnet. Voraussetzung ist, dass ein Objekt der Methodenklasse existiert. pruefepin (pin); allgemeine Syntax: methode(parameterliste ); empfaenger.einzahlen (betrag); allgemeine Syntax: objekt.methode(parameterliste ); 7
Externe Methode Kommunikation zwischen zwei Objekten Die Überweisung Externe Methode Kommunikation zwischen zwei Objekten Es werden die Methoden abheben() intern und einzahlen() extern benutzt. Der Zugriff auf das Konto-Objekt empfaenger erfolgt mit einer externen Methode Punktnotation: empfaenger.einzahlen() public void ueberweisen (Konto empfaenger, int betrag, int pin) { abheben(betrag); empfaenger.einzahlen(betrag); } 8
public class Konto { public Konto() { } Interne & externe Methodenaufrufe public boolean pruefepin( ) { } public void sperrekonto() { } public void einzahlen() { } public void abheben() { pruefepin(pin) ; sperrekonto(); } public void ueberweisen() { pruefepin(pin) ; sperrekonto(); abheben(); empfaenger.einzahlen(); } public void druckeauszug() { pruefepin(pin); sperrekonto ; } } wenn: ja wenn: ja Eingabe: pin, betrag, Übergabe: anzahlversuche pruefepin() nein versuche<3 pin stimmt und betrag>0 und betrag<1501 und kontostand+dispo>=betrag kontostand=kontostand-betrag Ausgabe neuer Kontostand die Methode abheben() Ausgabe Vorgang nicht möglich nein pin= 0; Ausgabe: Konto gesperrt 9
Codierung der Klasse Konto public void abheben (int betrag, pin) { pruefepin(pin); --> interne Methode pruefepin() if (versuche<3){ if ( pintest==true && betrag>0 && betrag<1501 ) && kontostand+dispo>=betrag { kontostand=kontostand-betrag; System.out.println("neuer Kontostand nach dem } Abheben: "+kontostand+ " Euro"); else { System.out.println("Vorgang nicht möglich!"); } } else { sperrekonto();} Modellierung der Klasse Konto die Methode druckeauszug() 10
Testen der Klasse Konto Test-Szenarien PIN 3 x falsch PIN 2 x falsch, dann richtig Abhebebetrag<0 Abhebebetrag>1500 Sperre? Versuche zurücksetzen? Meldung? Meldung? Abhebebetrag>Guthaben+Dispo? Meldung? Überweisung Methoden Kontostand ändert sich bei beiden? normale Funktion? Aufgaben a) Erstellen Sie das UML der Klasse Konto. b) Erstellen Sie das Struktogramm für die Methode abheben(). c) Implementieren Sie die Datenfelder. d) Implementieren Sie einen Konstruktor mit Eingabe durch Parameter und einen mit den vorgegebenen Werten. e) Implementieren Sie die Methoden gibkontostand(), pruefepin(), sperrekonto(), abheben(), einzahlen() und druckeauszug(). f) Implementieren Sie die Methode ueberweisen() mit PIN- Prüfung! g) Erzeugen Sie mindestens 2 Instanzen der Klasse und testen Sie das Programm unter verschiedenen Szenarien! 11