Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Mir ist ein Beispiel aus dem "Handbuch der Java-Programmierung" über das Thema Polymorphismus etwas unklar. Erstmal das Beispiel:
Code:
/* Gehaltsberechnung.java */
import java.util.Date;
abstract class Mitarbeiter
{
int persnr;
String name;
Date eintritt;
public Mitarbeiter()
{
}
public abstract double monatsBrutto();
}
class Arbeiter
extends Mitarbeiter
{
double stundenlohn;
double anzahlstunden;
double ueberstundenzuschlag;
double anzahlueberstunden;
double schichtzulage;
public double monatsBrutto()
{
return stundenlohn*anzahlstunden+
ueberstundenzuschlag*anzahlueberstunden+
schichtzulage;
}
}
class Angestellter
extends Mitarbeiter
{
double grundgehalt;
double ortszuschlag;
double zulage;
public double monatsBrutto()
{
return grundgehalt+
ortszuschlag+
zulage;
}
}
class Manager
extends Mitarbeiter
{
double fixgehalt;
double provision1;
double provision2;
double umsatz1;
double umsatz2;
public double monatsBrutto()
{
return fixgehalt+
umsatz1*provision1/100+
umsatz2*provision2/100;
}
}
public class Gehaltsberechnung
{
private static final int ANZ_MA = 100;
private static Mitarbeiter[] ma;
private static double bruttosumme;
public static void main(String[] args)
{
ma = new Mitarbeiter[ANZ_MA];
//Mitarbeiter-Array füllen, z.B.
//ma[0] = new Manager();
//ma[1] = new Arbeiter();
//ma[2] = new Angestellter();
//...
//Bruttosumme berechnen
bruttosumme = 0.0;
for (int i=0; i<ma.length; ++i) {
bruttosumme += ma[i].monatsBrutto();
}
System.out.println("Bruttosumme = "+bruttosumme);
}
}
Der Code an sich ist mir erstmal klar. Unklar hingegen ist mir der Teil wo es darum geht, das Mitarbeiter-Array zu füllen (im Beispiel nur Exemplarisch ausgeführt):
Zuerst erstelle ich im Array ein neues Manager-Objekt mit ma[0] = new Manager(). Um jetzt aber nach der Erzeugung des gesamten Arrays die Bruttosumme ausrechnen zu können, muss ich dem Manager erst seine Attribute zuweisen, also fixgehalt, provision1 etc...
Wie kann ich das machen? ma[0].fixgehalt = 12.00 geht ja nicht, da es sich um ein Mitarbeiter-Objekt handelt, dass dieses Attribut nicht kennt. Oder ist an dieser Stelle das Beispiel nicht ganz korrekt?
Nein, da hast du schon recht, das würd nicht gehen. Aber wie du auch schon sagst ist das ganze exemplarisch und soll wohl nur die Methodenüberladung von monatsBrutto() demonstrieren.
Ich bin mir nicht ganz sicher, aber ich glaub das abstract in bei der monatsBrutto() in der Mutterklasse Mitarbeiter zwingt dich dazu in den davon abgeleitetetn Klassen die Methode auszuprogrammieren. Weil in der Klasse Mitarbeiter gibts dazu ja keinen Methodenrumpf.
Bevor ein Manager in das Mitarbeiter-Array geschoben wird,
müssen seine Attribute gesetzt werden. Üblicherweise sollte dies
bereits im zugeordneten Konstruktor oder direkt nach Erzeugung geschehen.
@Leroy Also lag ich mit meinem Post garnicht so daneben? Weil ich hab noch nie was mit abstract gemacht, war nur mal logisch gedacht (oder zumindest versucht )
Es geht in dem Beispiel dadrum, dass du ein Mitarbeiter array hast (also von der Baseclass) und da dann die Spezialisierten Objekte reinpackst und mit dem aufruf der Methode wird die jeweilige Methode der Spezialisierung aufgerufen.
Wenn du des sinnvoll lauffähig machen willst, schrieb noch einen Konstruktor und / oder getter und setter Methoden.