/*
Datei............: Aufg0714.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 02.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 07.14
Kommentare.......:

Das nachfolgende Programm deklariert die Basisklasse Angestellter 
und die daraus abgeleiteten Klassen Sekretaerin, Verkaeufer und
Manager. Die Basisklasse ist abstrakt und implementiert die Methode
jahresGehalt auf der Basis der abstrakten Methode monatsGehalt,
die erst in den abgeleiteten Klassen definiert wird.

Da die Methode jahresGehalt bereits in der Basisklasse bekannt 
ist, kann sie für einen beliebigen Angestellten aufgerufen werden.
In unserem Fall erzeugt die Methode createGehaltsliste ein Array
von fünf Angestellten, von denen drei Sekretärinnen sind und jeweils
einer ein Verkäufer bzw. ein Geschäftsführer ist. Dieses Array wird 
an showGehaltsliste übergeben und dort auf dem Bildschirm ausgegeben.
Bei jedem Aufruf von jahresGehalt auf einem Arrayelement wird
die zur konkreten Klasse passende Methode monatsGehalt aufgerufen
und ihr Rückgabewert mit 12 multipliziert.

Die Vorteile des Polymorphismus kann man an der Implementierung
von showGehaltsliste sehr schön sehen. Die Methode ist vollkommen
unabhängig von der konkreten Implementierung einer abgeleiteten
Angestelltenklasse, solange diese monatsGehalt korrekt implementiert.
Auch, wenn neue Angestelltenklassen hinzukommen, braucht die
Methode showGehaltsliste nicht geändert werden.
*/
public class Aufg0714
{
  public static void main(String args[])
  {
	Angestellter gehaltsliste[] = createGehaltsliste();
	showGehaltsliste(gehaltsliste);
  }

  static Angestellter[] createGehaltsliste()
  {
	Angestellter liste[] = new Angestellter[5];
	//Drei Sekretärinnen erzeugen
	Sekretaerin sek = new Sekretaerin();
	sek.name = "Meier, Luise";
	sek.fest = 3200;
	liste[0] = sek;
	sek = new Sekretaerin();
	sek.name = "Schneider, Paula";
	sek.fest = 2850;
	liste[1] = sek;
	sek = new Sekretaerin();
	sek.name = "Rabensee, Fridolin"; //oh, ein Sekretär
	sek.fest = 3150;
	liste[2] = sek;
	//Einen Verkäufer erzeugen
	Verkaeufer verk = new Verkaeufer();
	verk.name = "Roericht, Eckhart";
	verk.fest = 2000;
	verk.provision = 5.0;
	verk.umsatz = 85428.73;
	liste[3] = verk;
	//Den Geschäftsführer unseres Unternehmens erzeugen
	Manager man = new Manager();
	man.name = "Lottemann, Erwin";
	man.fest = 5500;
	man.geschaeftsfuehrung = true;
	man.fuehrungskraft12 = false;
	man.firma10 = true;
	liste[4] = man;
	return liste;
  }

  static void showGehaltsliste(Angestellter liste[]) 
  {
	for (int i = 0; i < liste.length; ++i) {
	  System.out.println(liste[i].name);
	  System.out.println("  Monatsgehalt: " + liste[i].monatsGehalt());
	  System.out.println("  Jahresgehalt: " + liste[i].jahresGehalt());
	}
  }
}

abstract class Angestellter
{
  public String name;

  abstract double monatsGehalt();

  double jahresGehalt()
  {
	return 12.0 * monatsGehalt();
  }
}

class Sekretaerin
extends Angestellter
{
  double fest;

  double monatsGehalt()
  {
	return fest;
  }
}

class Verkaeufer
extends Angestellter
{
  double fest;
  double provision;
  double umsatz;

  double monatsGehalt()
  {
	return fest + (provision * umsatz / 100.0);
  }
}

class Manager
extends Angestellter
{
  double fest;
  boolean geschaeftsfuehrung;
  boolean fuehrungskraft12;
  boolean firma10;

  double monatsGehalt()
  {
	double ret = fest;
	if (geschaeftsfuehrung) {
	  ret += 1200.0;
	}
	if (fuehrungskraft12) {
	  ret += 650.0;
	}
	if (firma10) {
	  ret += 300.0;
	}
	return ret;
  }
}

