2013-03-26 9 views
5

Ich bin hier mit einem Problem stecken. Ich möchte den Setter von einem Attribut aus der Oberklasse (Elternklasse) in meiner Unterklasse (Kind) ändern, aber wenn ich diese Methode in meiner Unterklasse übersteige, kann ich nicht auf meine privaten Attribute von der Oberklasse zugreifen. Und der Punkt ist, sie müssen privat bleiben.Override Setter in Subklasse

Superklasse (Problem: setMinimumVoorraad (int voorraad);)

Paket domein;

public abstract class Artikel implements Weegbaar 
{ 
    private String omschrijving; 
    private double prijs; 
    private int aantalInStock; 
    private int minimumVoorraad; 

    public Artikel(String omschrijving, double prijs, int aantalInStock, int minimumVoorraad) 
    { 
     this.setOmschrijving(omschrijving); 
     this.setPrijs(prijs); 
     this.setAantalInStock(aantalInStock); 
     this.setMinimumVoorraad(minimumVoorraad); 
    } 

    @Override 
    public String toString() 
    { 
     String output = String.format(" \n omschrijving: %s \n prijs: %f \n In stock %d (minimumvoorraad = %d) \n", this.omschrijving, this.prijs, this.aantalInStock, this.minimumVoorraad); 
     return output; 
    } 
//----Getters---- 
    public String getOmschrijving() { 
     return omschrijving; 
    } 

    public double getPrijs() { 
     return prijs; 
    } 

    public int getAantalInStock() { 
     return aantalInStock; 
    } 

    public int getMinimumVoorraad() { 
     return minimumVoorraad; 
    } 

//----Setters---- 
    public void setOmschrijving(String omschrijving) { 
     this.omschrijving = omschrijving; 
    } 

    public void setPrijs(double prijs) { 
     this.prijs = prijs; 
    } 

    public void setAantalInStock(int aantalInStock) { 
     this.aantalInStock = aantalInStock; 
    } 

    public void setMinimumVoorraad(int minimumVoorraad) 
    { 
     if(minimumVoorraad < 2) 
      this.minimumVoorraad = 3; 
     else 
      this.minimumVoorraad = minimumVoorraad; 
    } 


} 

Subclass

package domein; 


public class Food extends Artikel 
{ 

    private String houdbaarheidsDatum; 
    private double nettoGewicht; 

    public Food(String omschrijving, double prijs, int aantalInStock, int minimumVoorraad, String houdbaarheidsDatum, double nettoGewicht) 
    { 
     super(omschrijving, prijs, aantalInStock, minimumVoorraad); 
     this.setHoudbaarheidsDatum(houdbaarheidsDatum); 
     this.setNettoGewicht(nettoGewicht); 
    } 

    @Override 
    public boolean isWeegbaar() 
    { 
     return true; 
    } 


//----Getters---- 
    public String getHoudbaarheidsDatum() { 
     return houdbaarheidsDatum; 
    } 

    public double getNettoGewicht() { 
     return nettoGewicht; 
    } 

//----Setters---- 
    public void setHoudbaarheidsDatum(String houdbaarheidsDatum) { 
     this.houdbaarheidsDatum = houdbaarheidsDatum; 
    } 

    public void setNettoGewicht(double nettoGewicht) { 
     this.nettoGewicht = nettoGewicht; 
    } 

    @Override 
    public void setMinimumVoorraad(int minimumVoorraad) 
    { 
     if(minimumVoorraad < 5) 
      this.minimumVoorraad = 6; 
     else 
      this.minimumVoorraad = minimumVoorraad; 
    } 


} 

Jemand, der mir helfen kann? Vielen Dank im Voraus.

+1

Ziemlich offensichtlich müssen wir Code sehen. –

Antwort

2

Die Antwort oben von NPE gegeben ist absolut der beste Weg, um dieses Problem zu lösen zu gehen. Es ist elegant und respektiert grundlegende Erbverträge zwischen Oberklasse und Unterklasse. Auch in Ihrer ursprünglichen Post, ist die Unterklasse tatsächlich restriktiver als die übergeordneten Klasse, so etwas zu tun, wie:

@Override 
public void setMinimumVoorraad(int minimumVoorraad) 
{ 
    if(minimumVoorraad <= 5) 
     super.setMinimumVoorraad(6); 
    else 
     super.setMinimumVoorraad(minimumVoorraad); 
} 

genau wie NPE würde vorgeschlagen wahrscheinlich funktionieren. (Beachten Sie, wie ich Ihren if Test geändert. Nicht sicher, ob es ein Tippfehler ist, aber in der ursprünglichen Implementierung 5 würde ein gültiges Minimum sein, aber Eingang wie 4 würde es 6 gesetzt.)

Andere (möglicherweise akzeptabel) Muster würde sei zu:

  1. Machen Sie die Mitglieder in Ihrer Elternklasse protected, die Sichtbarkeit geben würde. (Stellen Sie fest, dass Sie eine private Einschränkung erwähnt haben; dieses Muster wird nur erwähnt, um eine vollständigere Gesamtantwort zu liefern.)
  2. Delegieren Sie die Validierungslogik zu einer anderen Methode (die nicht privat ist). Auf diese Weise kann das Kind die Validierungsmethode überschreiben.

Und jetzt auf die (wahrscheinlich nicht akzeptabel) Muster von Java Reflexion mit:

@Override 
public void setMinimumVoorraad(int minimumVoorraad) { 

    try { 
     Field field = this.getClass().getSuperclass().getDeclaredField("minimumVoorraad"); 
     field.setAccessible(true); 

     if(minimumVoorraad <= 5) 
      field.set(this, 6); 
     else 
      field.set(this, minimumVoorraad); 

     field.setAccessible(false); 
    } 
    catch(NoSuchFieldException | IllegalAccessException e) { 
     // do something 
    } 
} 

Es ist erwähnenswert, dass, wenn Sie nie das tun in Ihrem ganzen Leben Sie wahrscheinlich für sie, desto besser . Nicht nur vollständig bricht alle Verträge, aber es beruht auf hart-codierten Strings, Feldnamen Lookups zu tun, die an und für sich ist ziemlich schmerzhaft. Aber es existiert. Und keine gute Antwort (bereits oben von NPE gegeben) wäre komplett ohne ein Beispiel dafür, wie nicht etwas zu tun ...

9

Eine Möglichkeit besteht darin, den Setter der Unterklasse in Bezug auf den Setter der Superklasse zu implementieren (auf den Sie vermutlich Zugriff haben).

Zum Beispiel ist die Setter unter der Annahme setFoo, dann der Version der Unterklasse könnte sein:

public void setFoo(Foo f) { 

    // Do subclass stuff pre-setting, if any 

    super.setFoo(f); 

    // Do subclass stuff post-setting, if any 
} 
+0

Kürzer und klarer als meine, +1 –

+0

@ T.J.Crowder: Danke für die Bearbeitung. – NPE

+0

Danke, aber ich möchte die bereits in meiner Oberklasse definierten Bedingungen loswerden. – Energyfellow