Springen naar inhoud

Java Override Setter Subklasse


  • Log in om te kunnen reageren

#1

Energyfellow

    Energyfellow


  • >100 berichten
  • 122 berichten
  • Ervaren gebruiker

Geplaatst op 26 maart 2013 - 09:12

Hey,

Ik heb een prombleempje, in onderstaande oefening moet ik mijn setter dat al gedefiniëerd is in de superklasse terug aanpassen (lees: override) in mjin subklasse. Maar ik moet rekening houden met de inkapsulatie dus mijn attributen moeten private blijven.

In dit geval heeft het niet veel zin om mijn super.setMinimumVoorraad(...) aan te roepen aangezien hij al gedefiniëerd is met andere waarden.

Afbeelding.PNG

Food.PNG

Superklasse

package 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;
	}

Subklasse


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;
	}
	
	
}
}

Dank bij voorbaat,
Roger

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 26 maart 2013 - 10:40

Doe gewoon super.setMinimumVoorraad? Aangezien Food altijd aan de voorwaarde van Artikel (> 2) voldoet is er geen probleem. Anders zou je minimumVoorraad protected moeten declareren.

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

#3

Energyfellow

    Energyfellow


  • >100 berichten
  • 122 berichten
  • Ervaren gebruiker

Geplaatst op 26 maart 2013 - 10:43

Inderdaad, ik ben een beetje te snel geweest.

Stel dat het nu eens niet klopte, hou zou je het dan oplossen?

Veranderd door Energyfellow, 26 maart 2013 - 10:43


#4

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 26 maart 2013 - 10:46

Het is mij niet duidelijk wat nou jouw probleem is. Ik vermoed dat je aanloopt tegen het 'probleem' dat je vanuit je subklasse niet de private variabelen van jouw abstracte klasse kunt bereiken. Je zou het zo kunnen doen in de klasse Food:
public void setMinimumVoorraad(int minimumVoorraad)
	{
		super.setMinimumVoorraad(Math.max(6, minimumVoorraad));
	}

Veranderd door EvilBro, 26 maart 2013 - 10:47


#5

Energyfellow

    Energyfellow


  • >100 berichten
  • 122 berichten
  • Ervaren gebruiker

Geplaatst op 26 maart 2013 - 10:58

@EvilBro, ik ben inderdaad wat te snel geweest.

Niet tegenstaande vond ik het interessant om eens te kijken of het effectief mogelijk was op een setter van een subclasse te overridden. Ik ben nu vrijwel zeker dat dit niet mogelijk is en je bij elke poging een conflict zult hebben met het protected defined behavior van de superklasse.

De enige oplossing is zoals julle hier zeggen, de super.setMinimumVoorraad() aanroepen wat enkel maar lukt als de twee setters geen conflict vormen.

#6

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 26 maart 2013 - 11:02

Als ze wel een conflict vormen is of je abstracte klasse niet goed (niet abstract genoeg) of je subklasse eigenlijk geen onderdeel van de abstracte klasse.

#7

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 26 maart 2013 - 11:03

De enige oplossing is zoals julle hier zeggen, de super.setMinimumVoorraad() aanroepen wat enkel maar lukt als de twee setters geen conflict vormen.

Je kan het oplossen door het attribuut protected te maken.
Andersijzds: als er een conflict is dan is er waarschijnlijk iets mis in je design.
(edit: wat EvilBro ook al aahaalt)

#8

Energyfellow

    Energyfellow


  • >100 berichten
  • 122 berichten
  • Ervaren gebruiker

Geplaatst op 26 maart 2013 - 11:05

Ik zou het inderdaad protected kunnen maken maar dan zondig ik weer tegen de regels van inkapseling. Inderdaad, er gewoon voor zorgen dat ik geen conflict krijg.

Bedankt mannen :-).





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures