/***************************************************************/
/* Prof. Dr. Carsten Vogt                                      */
/* FH Koeln, Fak. 07 / Nachrichtentechnik                      */
/* http://www.nt.fh-koeln.de/vogt                              */
/*                                                             */
/* Das Programm zeigt am Beispiel von Bankkonten die Benutzung */
/* des Klassenkonzepts, insbesondere                           */
/* - Definition von Klassen mit klassen- und objektbezogenen   */
/*   Attributen / Methoden sowie oeffentlichen und privaten    */
/*   Attributen, (siehe auch Datei KontoTest.java)             */
/* - Erzeugung und Loeschung von Objekten                      */
/*   (siehe auch Datei KontoTest.java) und                     */
/* - Vererbung mit Nutzung und Ueberschreiben von Methoden der */
/*   Superklasse.                                              */
/* Eine fensterorientierte Testumgebung befindet sich in der   */
/* Datei KontoTestGraf.java.                                   */
/***************************************************************/

/****************************************************************

   Die Klasse 'GeschuetztesKonto' erweitert die Klasse
   'Konto' (siehe Datei Konto.java) um Kontrollmechanismen.
   Sie enthaelt als Attribute
   - eine SuperPIN (klassenbezogen), die gebraucht wird, um die
     PIN eines Konto aendern zu koennen (aehnlich der Legitimation
     eines Bankangestellten) und
   - eine PIN (objektbezogen) fuer das Abheben.
   Sie ermöglicht mit ihren Methoden
   - das Erzeugen eines Kontos mit Ersteinzahlung,
   - das Setzen der PIN eines Kontos (sofern SuperPIN
     korrekt angegeben) und
   - das Abheben (sofern ausreichend Deckung vorhanden
     und PIN korrekt angegeben).   
      
****************************************************************/

class GeschuetztesKonto extends Konto {
 
 /* superPin (klassenbezogene Variable):
    Die PIN eines Kontos kann nur geaendert werden,
    wenn 'superPin' korrekt angeben wird. */

 static private int superPin = 4711;

 /* pin: Abheben ist nur bei Angabe der korrekten PIN moeglich */ 

 private int pin;

 /* Konstruktor 'GeschuetztesKonto()' */

 GeschuetztesKonto(double stand, int pin) {
  super(stand);
  this.pin = pin;
 }  

 /* 'pinSetzen()' setzt die PIN eines Kontos auf 'p'.
    Dazu muss ueber 'sup' die korrekte SuperPIN eingegeben werden.
    Liefert 0 bei Erfolg und -1 sonst. */ 

 public int pinSetzen(int sup, int p){
  if (sup==superPin) {
   pin = p;
   return 0;
  }
  else return -1;
 }

 /* 'abheben(betrag,p)' versucht, den Betrag 'betrag' vom Konto
    abzuheben. Voraussetzung ist die Angabe der korrekten
    PIN ueber 'p' und ein ausreichender Kontostand.
    Liefert den abgehobenen Betrag bei Erfolg und -1 sonst. */

 public double abheben(double betrag, int p) {
  if (pin!=p) return -1;
  return super.abheben(betrag);
 }

 /* 'abheben(betrag)' ueberschreibt die entsprechende Methode der
    Superklasse Konto. Die abheben()-Methode der Klasse Konto ist
    damit bei einem Objekt der Klasse GeschuetztesKonto nicht mehr
    aufrufbar, so dass ohne PIN kein Geld abgehoben werden kann. */

 public double abheben(double betrag) {
  System.out.println("Abheben nur mit PIN!");
  return -1;
 }

}

