zugriffsrechte abstract

bspainkf36

Erfahrenes Mitglied
Hey Leute :)

ich hätte da mal eine spezielle Frage zu einem Programm. Danke schon mal für die Hilfe :)
Also ich habe eine abstracte Oberklasse (Artikel) und zwei weiter Klasse(Handelsartikel und Werkstattartikel), welche von der Oberklasse erben, sowie eine seperate Klasse(Laden) mit der ich instanzen erzeuge! Hier mein Quellcode ... er ist nicht all zu lang, daher bin ich mal so frei und poste ihn ganz :pP

Das Problem liegt in der Klasse Laden. Dort gebe ich die Artikelnummer und den Gewinn( in der Oberklasse als abstract deklariert und in der Unterklasse implementiert) aus.
Auf diese Daten kann ich ohne Probleme zugreifen und ausgeben. Wenn ich jedoch probiere auf die Methode getMaterialkosten() zuzugreifen, die nicht in der Klasse Artikel deklariert wird, da sie nicht vererbt werden soll, scheitert dies.

Meine Frage wäre jetzt, wie kann ich auf die Methoden von den Unterklassen zugreifen umd die Daten zu verwerten.

Die Oberklasse Artikel
Code:
package info2;

abstract class Artikel {
  private String artikelnummer = "ohne";

  public Artikel() {
  }

  public Artikel (String ean) {
    this.artikelnummer = ean;
  }

  public String getArtikelnummer(){
    return artikelnummer;
  }

  public abstract double gewinn();
}

Die erbende Klasse Handelsartikel
Code:
package info2;

class HandelsArtikel extends Artikel{
  double einkaufspreis;
  double gewinnspanne; // Prozentualer Gewinnaufschlag

  public HandelsArtikel (String ean, double ep, double gs) {
    super (ean);
    this.einkaufspreis = ep;
    this.gewinnspanne = gs;
  }

  public double gewinn() {
    return (gewinnspanne * einkaufspreis);
  }
}

Die erbende Klasse Werkstattartikel
Code:
package info2;

class WerkstattArtikel extends Artikel {
  double materialkosten; // enthält bereits Gemeinkosten
  double fertigungskosten; // enthält bereits Gemeinkosten
  double gewinnspanne; // Prozentualer Gewinnaufschlag

  public WerkstattArtikel (String an, double mk, double fk, double gs) {
    super(an);
    this.materialkosten = mk;
    this.fertigungskosten = fk;
    this.gewinnspanne = gs;
  }

  public double gettest() {
    return this.materialkosten;
  }

  public double gewinn() {
    return (gewinnspanne * (materialkosten + fertigungskosten));
  }

  public void setMaterialkosten(double mk){
    this.materialkosten = mk;
  }

  public double getMaterialkosten(){
    return materialkosten;
  }
}

Code:
package info2;

class Laden {
  public Laden() {
  }

  public static void main(String[] args) {
    Artikel ware[] = new Artikel[4];
    ware[0] = new HandelsArtikel ("Maus", 25.75, 0.2);
    ware[1] = new WerkstattArtikel ("Tower", 180, 30, 0.15);
    ware[2] = new HandelsArtikel ("Holz", 30, 0.15);
    ware[3] = new WerkstattArtikel ("Teppich", 100, 30, 0.15);

    for (int i=0;i<=3;i++) {
      System.out.println(ware[i].getArtikelnummer());
      System.out.println(ware[i].gewinn());
      System.out.println(ware[i].getMaterialkosten()); //HIER DAS PROBLEM
   Auf die Materialkosten kann nicht zugegriffen werden, 
da sie in der abstrakten Oberklasse nicht deklariert worden ist - 
muss sie auch nicht, da sie nicht an die andere Klasse vererbt 
werden soll! Wie kann ich jetzt trotzdem auf die besagte Klasse 
zugreifen ohne sie in der Oberklasse zu deklarien?
    }
  }
}


DANKE noch mal für die Hilfe :)

Viele Grüße Kon
 
Hallo!

Eine Möglichkeit wäre Beispielsweise mit instanceof den genauen ArtikelTyp festzustellen und dann entsprechend zu Casten um anschließend die jeweilige Methode aufrufen zu können.

Gruß Tom
 
Hi

Ich hab mir das mal angeschaut, aber ich denke du wirst nicht drumrumkommen eine solche Methode in Artikel anzulegen, z.B.
Code:
...
public double getMaterialkosten()
{
	return 0;
}
...

Damit die jetzt nicht angezeigt werden bei den Handelsartikeln machst du folgende IF-Bedingung
Code:
if(ware[i] instanceof WerkstattArtikel)
	 System.out.println(ware[i].getMaterialkosten());

Ich finde die Lösung auch nicht wirklich schön hab aber ich denke das es nicht anders geht.

mfg 4men
 

Neue Beiträge

Zurück