Polyphorismus

FiselM

Mitglied
Hallo, hat jemand einen Plan was ich da für einen Fehler habe in der Vererbung Konzept des Polyphorismus


/**
* Beschreiben Sie hier die Klasse MitarbeUI.
*
* @author (Michael Fisel)
* @version (02.01.2008)
*/


class Mitarbeite
{
private int stunden ; //in Cent
private double stundenlohn ;
private double fixum;
private double gehalt;
private String name ;
private String vorname ;
private String adresse;
private String titel;

//Konstruktor
//public Mitarbeite(int stunden, double stundenlohn, double fixum, String name, String vorname, String adresse, String titel)
public Mitarbeite( String name, String vorname, String adresse, String titel)

{
//this.stunden = stunden;
//this.stundenlohn = stundenlohn;
//this.fixum = fixum;
this.name = name;
this.vorname = vorname;
this.adresse = adresse;
this.titel = titel;
}

public int getStunden()
{
return stunden;
}
public double getStundenlohn()
{
return stundenlohn;
}
public double getFixum()
{
return fixum;
}
public double getGehalt()
{
return gehalt;
}


public String getName()
{
return name;
}
public String getVorname()
{
return vorname;
}
public String getAdresse()
{
return adresse;
}
public String getTitel()
{
return titel;
}

public void buchen()
{

}
}



class Angestellter extends Mitarbeite
{
//Konstruktor
public Angestellter( String name, String vorname, String adresse, String titel)
{

super( name, vorname, adresse, titel);
}
double gehalt;
int stunden;
double stundenlohn;
double fixum;
//this.stunden = stunden;
//this.stundenlohn = stundenlohn;
//this.fixum = fixum;
@Override
public void buchen()
{
gehalt = fixum + (stunden * stundenlohn);
}

public double getStunden()
{
return stunden;
}

public double getStundenlohn()
{
return stundenlohn;
}

public double getGehalt()
{
return gehalt;
}

public double getFixum()
{
return fixum;
}
}



class Aushilfe extends Mitarbeite
{
//Konstruktor
public Aushilfe( String name, String vorname, String adresse, String titel)
{
super( name, vorname, adresse, titel);
}
double gehalt;
int stunden;
double stundenlohn;


@Override
public void buchen()
{
gehalt = stunden * stundenlohn;
}

public double getStunden()
{
return stunden;
}

public double getStundenlohn()
{
return stundenlohn;
}

public double getGehalt()
{
return gehalt;
}


}


class Chef extends Mitarbeite
{
//Konstruktor
public Chef( String name, String vorname, String adresse, String titel)
{

//this.fixum = fixum;
super( name, vorname, adresse, titel);
}
double gehalt;
double fixum;

@Override
public void buchen()
{
gehalt = fixum;
}


public double getGehalt()
{
return gehalt;
}

public double getFixum()
{
return fixum;
}
}

public class MitarbeiteUI
{
public static void main(String args[])
{
Angestellter einAngestellter = new Angestellter("Mayer","Hans","Teststrasse3 in 89709 Ulm","Diplom-Betriebswirt");
Aushilfe einAushilfe = new Aushilfe("Schmitt","Hans","Suchallee2 in 89785 Upflamoer","--");
Chef einChef = new Chef("Boss","Franz","Gartenalle 13 in 87654 Tripsdrill","Dr.");

einzahlen(einAngestellter,7,300.00,1000.00);
einzahlen(einAushilfe,5,200,0);
einzahlen(einChef,0,0,10000.00);

}
//C int stunden, double stundenlohn, double fixum)
private static void einzahlen(Mitarbeite einObjekt, int stunden, double stundenlohn, double fixum)

{
einObjekt.buchen();
System.out.println("Ein " + einObjekt.getTitel() + " " + einObjekt.getVorname() + " " + einObjekt.getName() + " aus " + einObjekt.getAdresse() + " hat soviel " +
einObjekt.getStunden() + " Stunden gearbeitet, das macht bei einem Stundenlohn " +
einObjekt.getStundenlohn() + " soviel Gehalt aus " + einObjekt.getGehalt());
}
}

Viele Grüße, Michael
 
Du hast da die Methode falsch überschrieben.
In der Oberklasse
PHP:
public int getStunden()
{
return stunden;
}
ist der Datentyp int und in der abgeleiteten Klasse
PHP:
public double getStunden()
{
return stunden;
}
double. Das geht nicht. Die Methode die überschrieben wird muss die gleiche Deklaration aufweisen. Pass das mal an, dann sollte es wohl gehen.
 
Es sind ein Haufen falsche Klammern drin, ich vermute aus Copy/Paste gründen. Nutzt bitten [ java] [ /java] Tags um Code einzufügen. Desweiteren deklarierst du Variablen als private (Stundenlohn usw.) und deklarierst sie dann nochmal in den Subklassen. Die gehören protected in der Superklasse und dann NICHT nochmal in der Subklasse deklariert.

Das recht gewöhnungsbedürftige auskommentieren macht das lesen deines Codes auch nicht gerade einfacher.

Kompilieren die Klassen denn? Fliegt eine Exception? Evtl bei der Ausführung? Stacktrace?

Gruß
Ollie
 
Hallo, ich habe jetzt ein paar Fehler selbst behoben und dank eurer Hilfe.


/**
* Beschreiben Sie hier die Klasse MitarbeUI.
*
* @author (Michael Fisel)
* @version (02.01.2008)
*/


class Mitarbeite
{
private int stunden ; //in Cent
private double stundenlohn ;
private double fixum;
private double gehalt;
private String name ;
private String vorname ;
private String adresse;
private String titel;

//Konstruktor
public Mitarbeite( String name, String vorname, String adresse, String titel)

{
this.name = name;
this.vorname = vorname;
this.adresse = adresse;
this.titel = titel;
}

public int getStunden()
{
return stunden;
}
public double getStundenlohn()
{
return stundenlohn;
}
public double getFixum()
{
return fixum;
}
public double getGehalt()
{
return gehalt;
}


public String getName()
{
return name;
}
public String getVorname()
{
return vorname;
}
public String getAdresse()
{
return adresse;
}
public String getTitel()
{
return titel;
}

public void buchen()
{
}
}



class Angestellter extends Mitarbeite
{
//Konstruktor
public Angestellter( String name, String vorname, String adresse, String titel)
{

super( name, vorname, adresse, titel);
}
double gehalt;
int stunden;
double stundenlohn;
double fixum;

@Override
public void buchen()
{
gehalt = fixum + (stunden * stundenlohn);
}

public int getStunden()
{
return stunden;
}

public double getStundenlohn()
{
return stundenlohn;
}

public double getGehalt()
{
return gehalt;
}

public double getFixum()
{
return fixum;
}
}


class Aushilfe extends Mitarbeite
{
//Konstruktor
public Aushilfe( String name, String vorname, String adresse, String titel)
{
super( name, vorname, adresse, titel);
}
double gehalt;
int stunden;
double stundenlohn;

@Override
public void buchen()
{
gehalt = stunden * stundenlohn;
}

public int getStunden()
{
return stunden;
}

public double getStundenlohn()
{
return stundenlohn;
}

public double getGehalt()
{
return gehalt;
}
}


class Chef extends Mitarbeite
{
//Konstruktor
public Chef( String name, String vorname, String adresse, String titel)
{

super( name, vorname, adresse, titel);
}
double gehalt;
double fixum;

@Override
public void buchen()
{
gehalt = fixum;
}
public double getGehalt()
{
return gehalt;
}
public double getFixum()
{
return fixum;
}
}

public class MitarbeiteUI
{
public static void main(String args[])
{
Angestellter einAngestellter = new Angestellter("Mayer","Hans","Teststrasse3 in 89709 Ulm","Diplom-Betriebswirt");
Aushilfe einAushilfe = new Aushilfe("Schmitt","Hans","Suchallee2 in 89785 Upflamoer","--");
Chef einChef = new Chef("Boss","Franz","Gartenalle 13 in 87654 Tripsdrill","Dr.");

einzahlen(einAngestellter,7,300.00,1000.00);
einzahlen(einAushilfe,5,200,0);
einzahlen(einChef,0,0,10000.00);

}

private static void einzahlen(Mitarbeite einObjekt, int stunden, double stundenlohn, double fixum)

{
einObjekt.buchen();
System.out.println("Ein " + einObjekt.getTitel() + " " + einObjekt.getVorname() + " " + einObjekt.getName() + " aus " + einObjekt.getAdresse() + " hat soviel " +
einObjekt.getStunden() + " Stunden gearbeitet, das macht bei einem Stundenlohn " +
einObjekt.getStundenlohn() + " soviel Gehalt aus " + einObjekt.getGehalt());
}
}

Das Programm compiliert jetzt ohne Fehler und funktioniert auch.

Mein Problem ist, dass die Daten aus den Unterklassen (Gehalt, Stunden , Stundenlohn)
nicht an die Ergebnismaske übergeben werden?

Ein Diplom-Betriebswirt Hans Mayer aus Teststrasse3 in 89709 Ulm hat soviel 0 Stunden gearbeitet, das macht bei einem Stundenlohn 0.0 soviel Gehalt aus 0.0
Ein -- Hans Schmitt aus Suchallee2 in 89785 Upflamoer hat soviel 0 Stunden gearbeitet, das macht bei einem Stundenlohn 0.0 soviel Gehalt aus 0.0
Ein Dr. Franz Boss aus Gartenalle 13 in 87654 Tripsdrill hat soviel 0 Stunden gearbeitet, das macht bei einem Stundenlohn 0.0 soviel Gehalt aus 0.0

Viele Grüße, Michael
 
Ich versuch s mal mit Java Code tags

Java:
/**
* Beschreiben Sie hier die Klasse MitarbeUI.
*
* @author (Michael Fisel)
* @version (02.01.2008)
*/


class Mitarbeite
  {
     protected int stunden;
     protected double stundenlohn;
     protected double fixum;
     protected double gehalt;
     private String name ;
     private String vorname ;
     private String adresse;
     private String titel;

//Konstruktor
     public Mitarbeite( String name, String vorname, String adresse, String titel)
        {
            this.name = name;
            this.vorname = vorname;
            this.adresse = adresse;
            this.titel = titel;
         }

      public int getStunden()
         {
             return stunden;
         }
      public double getStundenlohn()
         {
             return stundenlohn;
         }
      public double getFixum()
         {
             return fixum;
          }
       public double getGehalt()
          {
             return gehalt;
           }
       public String getName()
          {
             return name;
           }
       public String getVorname()
           {
              return vorname;
           }
        public String getAdresse()
           {
              return adresse;
            }
         public String getTitel()
            {
               return titel;
             }

         public void buchen()
            {
            }
  }



class Angestellter extends Mitarbeite
  {
//Konstruktor
      public Angestellter( String name, String vorname, String adresse, String titel)
          {
              super( name, vorname, adresse, titel);
           }
      double gehalt;
      int stunden; 
      double stundenlohn;
      double fixum;
      @Override
       public void buchen()
           {
               gehalt = fixum + (stunden * stundenlohn); 
            }
       public int getStunden()
            {
                return stunden;
            }
       public double getStundenlohn()
            {
                return stundenlohn;
            }
       public double getGehalt()
            {
                return gehalt;
             }
       public double getFixum()
             {
                return fixum;
              }
   }
class Aushilfe extends Mitarbeite
   {
//Konstruktor
       public Aushilfe( String name, String vorname, String adresse, String titel)
           {
              super( name, vorname, adresse, titel);
           }
          double gehalt;
          int stunden;
          double stundenlohn;
          @Override
          public void buchen()
              {
                   gehalt = stunden * stundenlohn;
              }
          public int getStunden()
              {
                  return stunden;
               }
          public double getStundenlohn()
               {
                   return stundenlohn;
               }
          public double getGehalt()
               {
                   return gehalt;
               }
  }
class Chef extends Mitarbeite
  {
   //Konstruktor
      public Chef( String name, String vorname, String adresse, String titel)
          {
              super( name, vorname, adresse, titel);
          }
          double gehalt;
          double fixum;
          @Override
          public void buchen()
              {
                  gehalt = fixum;
               }
          public double getGehalt()
              {
                 return gehalt;
               }
           public double getFixum()
              {
                  return fixum;
              }
   }

public class MitarbeiteUI
   {
      public static void main(String args[])
          {
              Angestellter einAngestellter = new Angestellter("Mayer","Hans","Teststrasse3              in 89709 Ulm","Diplom-Betriebswirt");
              Aushilfe einAushilfe = new Aushilfe("Schmitt","Hans","Suchallee2 in 89785              Upflamoer","--");
              Chef einChef = new Chef("Boss","Franz","Gartenalle 13 in 87654 Trips","Dr.");

              einzahlen(einAngestellter,7,300.00,1000.00);
              einzahlen(einAushilfe,5,200,0);
              einzahlen(einChef,0,0,10000.00);

           }
       private static void einzahlen(Mitarbeite einObjekt, int stunden, double stundenlohn,     double fixum)
           {
              einObjekt.buchen();
              System.out.println("Ein " + einObjekt.getTitel() + " " + einObjekt.getVorname()   + " " + einObjekt.getName() + " aus " + einObjekt.getAdresse() + " hat soviel " +
einObjekt.getStunden() + " Stunden gearbeitet, das macht bei einem Stundenlohn " +
einObjekt.getStundenlohn() + " soviel Gehalt aus " + einObjekt.getGehalt());
            }
         }

Mit den Java tags muss ich noch üben?

Viele Grüße, Michael
 
Zuletzt bearbeitet von einem Moderator:
In meinem Programm besteht der Fehler, das die Informationen aus den Unterklassen Chef, Angestellter und Aushilfe nicht an die Klasse MitarbeiteUI zurückgegeben werden.
Wo habe ich da einen Fehler gemacht?
 
Also hier ein kleines Beispiel mit einer Hierarchie über drei Klasse.
Es sollte dir zeigen, was genau die Idee hinter der Polymorphie ist und dann kannst du das ja auf dein Beispiel anwenden.
Hoffe es hilft dir weiter.

Java:
import java.util.*;

public class Polymorphie
{
	// Ein Beispiel für FiselM
	public static void main(String[] args){
		Vector<Oberklasse> container = new Vector<Oberklasse>();        
		container.add(new Oberklasse());
		container.add(new SubKlasse());
		container.add(new SubSubKlasse());
		// in Container sind alle Objekte als Oberkalsse behandlet, d.h. dass ...
		// ...alle Objekte die (überschriebene) Methode prtInfo() kennen, aber ...
		// ...jedes in der spezifischen Art seienr Klasse.
	     for (Enumeration<Oberklasse> e = container.elements() ; e.hasMoreElements() ;) {
		     System.out.println("***********************");
			 e.nextElement().prtInfo(); // Es wird immer die überschreiende Methde ausgeführt!
	     }

		 // Folgender Code ist nicht möglich, da im Container alle Objekte vom Typ Oberkalsse sind.
		 // container.elementAt(2).eineMethodeVonSubKlasse();
		 // Hier meldet der Compiler einen Fehler.

		 // Um auf die "Spezialitäten" der Unterkalsse zuzugreifen, braucht's ein casting
		 ((SubSubKlasse) container.elementAt(2)).eineMethodeVonSubSubKlasse();
	}

};

class Oberklasse
{
	protected String msg = "Das ist die Oberklasse";

	Oberklasse(){}

	void prtInfo(){
		System.out.println(msg);
	}
};

class SubKlasse extends Oberklasse
{
	private String info = "Sie ist von Oberklasse abgeleitet.";

	SubKlasse(){
		msg = "Das ist die Subklasse";
	}

	// überschreiben der Methode aus Oberklasse
	void prtInfo(){
		super.prtInfo(); // so kann die überschriebene Methode doch genutzt werden.
		System.out.println(info);
	}

	void eineMethodeVonSubKlasse(){
		System.out.println("Hier wirkt der Polymorphismus nicht!!*");
	}
};

class SubSubKlasse extends SubKlasse
{
	private String info = "SubSubKlasse: Sie ist von SubKlasse abgeleitet.";
	// dieses Attribut Info hat mit jenem in SubKlasse NICHTS gemeinsam, da private...
	// ...bei der Vererbuung auch "abschottet".

	SubSubKlasse(){
	}

	// überschreiben der Methode aus Oberklasse
	void prtInfo(){
		System.out.println(info);
	}

	void eineMethodeVonSubSubKlasse(){
		System.out.println("das ist eine Methode nur von SubSubKlasse");
	}

};
 
Ich habe jetzt eine Lösung, für mein Problem gefunden?

Java:
class Mitarbeite
{
protected int stunden ; //in Cent
protected double stundenlohn ;
protected double fixum;
protected double gehalt;
private String name ;
private String vorname ;
private String adresse;
private String titel;

//Konstruktor
public Mitarbeite(int stunden, double stundenlohn, double fixum,  String name, String vorname, String adresse, String titel)

{

this.fixum=fixum;
this.stundenlohn=stundenlohn; 
this.stunden=stunden;
this.name = name;
this.vorname = vorname;
this.adresse = adresse;
this.titel = titel;
}

public int getStunden()
{
return stunden;
}
public double getStundenlohn()
{
return stundenlohn;
}
public double getFixum()
{
return fixum;
}
public double getGehalt()
{
return gehalt;
}


public String getName()
{
return name;
}
public String getVorname()
{
return vorname;
}
public String getAdresse()
{
return adresse;
}
public String getTitel()
{
return titel;
}

 public void buchen()
{
 
 }
}



class Angestellter extends Mitarbeite
{
//Konstruktor
public Angestellter(int stunden, double stundenlohn, double fixum, String name, String vorname, String adresse, String titel)
{

super(stunden,stundenlohn, fixum,  name, vorname, adresse, titel);
}
double gehalt;
int stunden;
double stundenlohn;
double fixum;
@Override
public void buchen()
{
gehalt = super.fixum + (super.stunden * super.stundenlohn);
}

public int getStunden()
{
return super.stunden;
}

public double getStundenlohn()
{
return super.stundenlohn;
}

public double getGehalt()
{
return gehalt;
}

public double getFixum()
{
return super.fixum;
}
}



class Aushilfe extends Mitarbeite
{
//Konstruktor
public Aushilfe(int stunden,double stundenlohn, double fixum,   String name, String vorname, String adresse, String titel)
{
super(stunden,stundenlohn,fixum, name, vorname, adresse, titel);
}
double gehalt;
int stunden;
double stundenlohn;


@Override
public void buchen()
{
gehalt = super.stunden * super.stundenlohn;
}

public int getStunden()
{
return super.stunden;
}

public double getStundenlohn()
{
return super.stundenlohn;
}

public double getGehalt()
{
return gehalt;
}
}


class Chef extends Mitarbeite
{
//Konstruktor
public Chef(int stunden,double stundenlohn, double fixum,  String name, String vorname, String adresse, String titel)
{

super(stunden,stundenlohn, fixum, name, vorname, adresse, titel);
}
double gehalt;
double fixum;

@Override
public void buchen()
{
gehalt = super.fixum;
}

public double getGehalt()
{
return gehalt;
}

public double getFixum()
{
return super.fixum;
}
}

public class MitarbeiteUI
{
public static void main(String args[])
{
Angestellter einAngestellter = new Angestellter(7,100.0,1500.0,"Mayer","Hans","Teststrasse3 in 89709 Ulm","Diplom-Betriebswirt");
Aushilfe einAushilfe = new Aushilfe(5,20.0,0,"Schmitt","Hans","Suchallee2 in 89785 Upflamoer","--");
Chef einChef = new Chef(0,0,10000.0,"Boss","Franz","Gartenalle 13 in 87654 Tripsdrill","Dr.");

einzahlen(einAngestellter,7,100.0,1500.0);
einzahlen(einAushilfe,5,20.0,0);
einzahlen(einChef,0,0,10000.0);

}
//C int stunden, double stundenlohn, double fixum)
private static void einzahlen(Mitarbeite einObjekt, int stunden, double stundenlohn, double fixum)
{
einObjekt.buchen();
System.out.println("Ein " + einObjekt.getTitel() + " " + einObjekt.getVorname() + " " + einObjekt.getName() + " aus " + einObjekt.getAdresse() + " hat soviel " +
einObjekt.getStunden() + " Stunden gearbeitet, das macht bei einem Stundenlohn " +
einObjekt.getStundenlohn() + " und einem Fixum von " + einObjekt.getFixum() + " soviel Gehalt aus " + einObjekt.getGehalt());
}
}

das könnte so funktionieren?

Viele Grüße, Michael
 
Zuletzt bearbeitet von einem Moderator:
Hallo FiselM,

so auf die Schnelle (ein Blick, Code nicht ausgeführt) sehe ich noch 2 Sachen, die du anpasst solltest.

  1. Die Attribute der Oberklasse müssen in den Unterklassen nicht redeklariert werden. Du kannst trotzdem darauf zugreifen. Das hat Dir ja auch Oliver Gierke schon geraten.
  2. Die Methode buchen wird in der Oberkalsse "nicht gebraucht". Daher würde ich diese Methode und somit auch die Klasse abstract deklarieren. Dadurch gehst du sicher, dass es nie eine Instanz von Mitarbeite gibt und somit die "leere" Methode buchen nicht aufgerufen werden kann.
Ansonsten sollte es dann wohl klappen.
Gruss und schönes Wochende
 
Zurück