Eerste eigen applicatie

Status
Niet open voor verdere reacties.
Ik heb nog even een paar dingen aangepast.
Code:
import java.util.ArrayList;

public class DamascusShoarma {
    private int aantalkoks;
    private int aantalbezorgers;
    private ArrayList<Personen> personenlijst = new ArrayList<Personen>();
    
    public DamascusShoarma(){
        personenlijst.add(new Kok("Jonny", "Singel 23", "1234AB", "Heemskerk", 10000.00, 2461357));
        personenlijst.add(new Kok("Berend", "Kleidreef 222", "4321BA", "Beverwijk", 10000.00, 1357246));
        personenlijst.add(new Bezorger("Klaas", "Tulpstraat 45", "6446JF", "Castricum", 5000.00, 7654321));
        personenlijst.add(new Bezorger("Jan", "Rozengracht 488", "1011DS", "Amsterdam", 5000.00, 1234567));
        personenlijst.add(new Klant("Amanda", "Commandeurslaan 44", "1962JJ", "Heemskerk"));
    }
    
    public static void main(String[] args) {
        
    }
    
    public int telKoks() {
        int totaal = 0;
        Kok kok = new Kok();
        
        for(int i = 0; i > personenlijst.size()-1; i++){
            if(personenlijst.get(i).equals(kok)){
                totaal++;
            }
        }
        return totaal;
    }
}


public class Personen {
    public String naam;
    public String adres;
    public String postcode;
    public String woonplaats;
    
    public Personen(String naam, String adres, String postcode, String woonplaats) {
        this.naam = naam;
        this.adres = adres;
        this.postcode = postcode;
        this.woonplaats = woonplaats;
    }
    
    public Personen(){
        
    }
    
    public void setNaam(String nieuweNaam) {
        this.naam = nieuweNaam;
    }
    public String getNaam() {
        return this.naam;
    }
    
    public void setAdres(String nieuwAdres) {
        this.adres = nieuwAdres;
    }
    public String getAdres() {
        return this.adres;
    }
    
    public void setPostcode(String nieuwePostcode) {
        this.postcode = nieuwePostcode;
    }
    public String getPostcode() {
        return this.postcode;
    }
    
    public void setWoonplaats(String nieuweWoonplaats) {
        this.woonplaats = nieuweWoonplaats;
    }
    public String getWoonplaats() {
        return this.woonplaats;
    }
}

public class Klant extends Personen {
    private boolean tevreden;
    private int number;
    
    public Klant(String naam, String adres, String postcode, String woonplaats) {
        super(naam, adres, postcode, woonplaats);
        
        System.out.println("Hello, my name is " + naam + " and I'd like to order a sandwich");
        
        int number = (int) (Math.random() * 5);
        
        if(number > 2) {
            tevreden = true;
            System.out.println("Your sandwich tasted delicious");
        } else {
            tevreden = false;
            System.out.println("Your sandwich tasted disgusting");
        }
        
    }
}


public class Medewerker extends Personen {
	
	public int sofinummer;
	public double salaris;
	
	public Medewerker(String naam, String adres, String postcode, String woonplaats, double salaris, int sofinummer) {
            super(naam, adres, postcode, woonplaats);
            this.salaris = salaris;
            this.sofinummer = sofinummer;
	}	
        
        public Medewerker(){
            
        }
	
	public void setSofinummer(int nieuwSofinummer) {
		sofinummer = nieuwSofinummer;
	}
	public int getSofiummer() {
		return sofinummer;
	}
	
	public void setSalaris(double nieuwSalaris) {
		salaris = nieuwSalaris;
	}
	public double getSalaris() {
		return salaris;
	}
}


public class Kok extends Medewerker {
	public boolean kookboek;
	
	public Kok(String naam, String adres, String postcode, String woonplaats, double salaris, int sofinummer) {
		super(naam, adres, postcode, woonplaats, salaris, sofinummer);
                System.out.println("Ik ben kok en mijn naam is " + naam);
	}
        public Kok(){
            
        }
}


public class Bezorger extends Medewerker {
	public boolean eigenbrommer;
	
	public Bezorger(String naam, String adres, String postcode, String woonplaats, double salaris, int sofinummer) {
		super(naam, adres, postcode, woonplaats, salaris, sofinummer);
                System.out.println("Ik ben bezorger en mijn naam is " + naam);
	}

}

Nu moet je geen problemen meer krijgen met de .equals(kok)

Je hebt in de main methode gezet:
Code:
DamascusShoarma damascus = new DamascusShoarma();
Dat moet er niet in.
Dit omdat je dan een compleet nieuwe class (DamascusShoarma) aanmaakt. En dat doe je al als je het programma start.
 
Nu heb ik dan die return waarde "totaal", maar waar kan ik die dan uitlezen?
Moet ik deze in de class kok uitlezen of in de main-class?
En hoe doe ik dat dan, ik heb al verschillende opties geprobeerd.

Ik heb in de main method inderdaad een nieuwe instantie van de class DamascusShoarma gemaakt om het programma te starten.
Dit is toch ook de bedoeling om de verschillende prints op het scherm te krijgen?
 
Binnen dezelfde class een instantie van de class zelf starten is niet iets wat normaal gedaan wordt.
Het beste zou je DamascusShoarma niet als Main class kunnen gebruiken, maar een aparte class maken welke alleen dient om het DamascusShoarma aan te roepen.


Als je het aantal koks wil hebben uit de functie telKoks(), dan is het enige wat je dient te doen is een int variabele aan te maken(die heb je al, dat is aantalKoks) en vervolgens zodra alle personen aangemaakt zijn, de functie uitvoeren

Code:
aantalKoks = telKoks();
Dan returned de telKoks() de "totaal" naar de int aantalKoks
Dit dient in de class DamascusShoarma te gebeuren.
 
Volgens de case is de Damascus class de mainclass, dus ik hou mij aan de case.
Ik moet ook zeggen dat tot nu toe alle programma's van de studie worden gestart door in de main-method de main-class aan te roepen.
Dus als ik dat zo doe hou ik me ook aan de tot nu toe opgedane kennis.

Echter ik ben niet zo eigenwijs dat ik niet wil leren :P.
Jij zei:

Binnen dezelfde class een instantie van de class zelf starten is niet iets wat normaal gedaan wordt.

Dit had bzub inderdaad ergens in deze topic ook al gezegd, maar wat is daar het nadeel van?
Waarom zou je dat niet doen en wat "kan" er eventueel misgaan als je dat wel zo doet?


Dat van die returnwaarde was een moment van niet nadenken, stom van mij, sorry.
 
Je kan je ook aan je case houden en dan toch het op de manier doen zoals wij voorstellen ;)
Wat je dan kan doen:

DamascusShoarma class hernoemen
De mainmethode eruit halen
Vervolgens een nieuwe class aanmaken. Die DamascusShoarma noemen, en daar dan alleen een mainmethode in zetten die dus de net hernoemde class aanroept :)

De reden waarom het niet gebruikelijk is, is omdat je de class al aangemaakt hebt zodra je het programma start. Als je dan in de main nog een keer zegt dat je die class aangemaakt wil hebben, heb je dus eigenlijk 2 precies dezelfde classes. Dit is nutteloos gebruik van geheugenruimte. Vooral in grote programma's zal het geheugen het niet fijn gaan vinden ;)
 
Laatst bewerkt:
Ok dat is helder. Dank jullie wel.

De method telkoks() returned 0 :S.
Dat is eigenlijk het enige dat nog niet helemaal gaat zoals het moet.
Ok, en ik moet nog veel documentatie in de verschillende classes zetten, al is het maar voor mezelf om te kijken of ik alles goed begrijp.

Oh nee, bestel klant moet ik nog doen.
Ik heb nu in de constructor van de klasse klant een System.out.println() staan met de bestelling, maar dit moet in een eigen method komen te staan:

bestelling(Klant a).

Ik ga er vanuit dat deze, netals de telkoks() en aantalbezorgers() in de klasse DamascusShoarma moet komen, a kan natuurlijk staan voor een index in de ArrayList, maar hoe zou ik dit het beste kunnen opzetten?

Code:
public String bestelling(Klant a) {
Klant a = personenlijst(4);

System.out.println(a + " heeft een broodje besteld");
}
 
Je zou dit eens kunnen proberen met je telKoks():
Code:
    public int telKoks() {
        int totaal = 0;
        Kok kok = new Kok();
        for(int i = 0; i > personenlijst.size()-1; i++){
            if(personenlijst.get(i).getClass().equals(kok.getClass())){
                totaal++;
            }
        }
        return totaal;
    }
Als deze niet wil, dan zou je bzub's methode kunnen proberen.
Elke keer dat je een kok aanmaakt de teller 1 omhoog doen.

Code:
public String bestelling(Klant a) {
Klant a = personenlijst(4);

System.out.println(a + " heeft een broodje besteld");
}
Dat gaat niet werken, je kan niet zomaar een klant printen omdat klant een object is.
Je zou er dan de naam van moeten getten Wat je nu ook nog doet is eerst een variabele als parameter in de methode meegeven, en dan in de functie zelf de parameter nogmaals als lokale variabele proberen te instantiëren.

Zoals het er dan uit zo horen te zien:
Code:
public void getbestelling(Klant a){
System.out.println(a.getNaam() + "heeft een broodje besteld");
}

Als je er een public String getBestelling dan verwacht de functie dat je een returnwaarde geeft.
Dan zou je functie er als volgt uit komen te zien:

Code:
public String getBestelling(Klant a){
return a.getNaam() + "heeft een broodje besteld";
}

Die functie kan je dan wel weer met een println aanroepen. Dat zou dan worden:
Code:
System.out.println(getBestelling(personenlijst.get(4)));

Daarnaast zou je ook nog per klant een aparte variabele aan kunnen maken bestelling

Dan zou je klant class er zo uit komen te zien:
Code:
public class Klant extends Personen {
    private boolean tevreden;
    private int number;
    private String bestelling = "";
    
    public Klant(String naam, String adres, String postcode, String woonplaats) {
        super(naam, adres, postcode, woonplaats);
        
        System.out.println("Hello, my name is " + naam + " and I'd like to order a sandwich");
        
        int number = (int) (Math.random() * 5);
        
        if(number > 2) {
            tevreden = true;
            System.out.println("Your sandwich tasted delicious");
        } else {
            tevreden = false;
            System.out.println("Your sandwich tasted disgusting");
        }
        
    }
    
    public void setBestelling(String nieuweBestelling){
        bestelling = nieuweBestelling;
    }
    
    public String getBestelling(){
        return bestelling;
    }
}

dan zou je functie er zo uit komen te zien:

Code:
public String getBestelling(Klant a){
 return a.getNaam() + "heeft" + a.getBestelling() + "besteld";
}
of meteen met een println
Code:
public void getBestelling(Klant a){
System.out.println(a.getNaam() + "heeft" a.getBestelling() + "besteld");
}

Ik hoop dat je het allemaal nog kan volgen :)
 
Laatst bewerkt:
Ik ga het morgen allemaal ff bekijken.
Ik heb het nu net even vluchtig doorgekeken en het lijkt me wel duidelijk.
Of ik het allemaal nog kan volgen vraag je!!
Ik denk dat ik in de afgelopen dagen van de info in deze post meer heb geleerd van Java dan in de afgelopen 9 hoofdstukken uit het leerboek :P.
Mocht ik nog vragen hebben dan post ik deze uiteraard weer hier.
Voor nu bedankt voor alle hulp.
 
Ik ben de draad nog niet helemaal kwijt, maar ik heb me een versuffing gezocht naar de fout in de functie om het aantal koks weer te geven.
Nou ik heb hem gevonden hoor :S:S:S.

De fout zat hem in de for-lus.

i = 0; i > personenlijst.size() enz enz enz.

i zal NOOIT groter zijn dan de persinenlijst.size() :D

Het moet dus hetvolgende zijn:

Code:
public int telKoks() {
        int totaal = 0;
        Kok kok = new Kok();
        for(int i = 0; i < personenlijst.size()-1; i++){
            if(personenlijst.get(i).getClass().equals(kok.getClass())){
                totaal++;
            }
        }
        return totaal;
    }

Het aantal bezorgers kan ik hetzelfde doen, de bestelling zal alleen nog een probleem worden naar mijn idee.
Ik ga er zo nog ff naar kijken, want ik denk dat ik niet helemaal begrijp wat je daarmee bedoeld.
 
Helaas moet ik toch terug naar dit forum om ook het laatste puntje op te lossen.
Ik heb er voor gekozen om deze methode te gebruiken:

Code:
public void getBestelling(Klant a){
    System.out.println(a.getNaam() + "heeft" a.getBestelling() + "besteld");
}

Nu weet ik alleen niet wat ik in de main-method in moet vullen voor Klant a.

String bestelling = getBestelling(?????);

Ik kan volgens mij niet zomaar een naam of een nummer invoeren toch?
Een nummer zou refereren naar een plaats in de arraylist en een naam is toch geen variabele?
Hoe zou ik dit dan moeten doen?
 
dat zou dan worden:
Code:
String bestelling = getBestelling(personenlijst.get(hiereennummervanindeArrayList));

Omdat je een Class Klant meegeeft aan de functie, moet je de hele class dus getten uit de ArrayList.
 
Daar ben ik dan toch nog een keer :S.
Ik kom er toch nog niet helemaal uit.
Ik krijg met onderstaande code een error:

DamascusShoarma.java:76: getBestelling(Klant) in DamascusShoarma cannot be applied to (Personen)
String bestelling = getBestelling(personenlijst.get(4));
^
1 error

Code:
/*
 * 	Eerst wordt de ArrayList uit de Java Library utilities gehaald.
 *	Deze gebruiken we om de personen in een array te kunnen zetten.
 *	We gebruiken deze tool om simpel mensen toe te kunnen voegen die ook verschillende statussen hebben.
 */

import java.util.ArrayList;

public class DamascusShoarma {

/*
 *	We gebruiken private variabelen omdat deze variabelen niet buiten de class gebruikt hoeven te worden.
 *	Op deze manier voorkom je dat eventuele andere programmeurs dat doen of dat je zelf de mist in gaat.
 */
	private int aantalkoks;
    private int aantalbezorgers;
    private ArrayList<Personen> personenlijst = new ArrayList<Personen>();

/*
 *	Hieronder maken we een method die zorgt voor het tellen van het aantal koks
 *	dat de Shoarmazaak in dienst heeft.
 *	We maken hierbij gebruik van de eerder aangemaakte ArrayList.
 */  
    public int telKoks() {
        int koks = 0;
        Kok kok = new Kok();
        for(int i = 0; i < personenlijst.size()-1; i++){
            if(personenlijst.get(i).getClass().equals(kok.getClass())){
                koks++;
            }
        }
        return koks;
    }

/*
 *	Dezelfde method als hierboven wordt gebruikt voor het tellen van het aantal bezorgers
 *	dat de zaak in dienst heeft.
 */
     
    public int getaantalbezorgers() {
        int bezorgers = 0;
        Bezorger bezorger = new Bezorger();
        for(int i = 0; i < personenlijst.size()-1; i++){
            if(personenlijst.get(i).getClass().equals(bezorger.getClass())){
                bezorgers++;
            }
        }
        return bezorgers;
    }

/*
 *	De method getBestelling zorgt er voor dat de naam van de klant die een bestelling heeft geplaatst
 *	geprint wordt.
 */
 
    public void getBestelling(Klant a){
    	System.out.println(a.getNaam() + "heeft een broodje besteld");
	}

/* 
 *	Hieronder volgt de constructor van deze main class.
 *	Dit is eigenlijk de motor van het programma.
 *	Deze constructor zorgt voor alle pints op het scherm na het compilen.
 */
     
    public DamascusShoarma(){
        personenlijst.add(new Kok("Jonny", "Singel 23", "1234AB", "Heemskerk", 10000.00, 2461357));
        personenlijst.add(new Kok("Berend", "Kleidreef 222", "4321BA", "Beverwijk", 10000.00, 1357246));
        personenlijst.add(new Bezorger("Klaas", "Tulpstraat 45", "6446JF", "Castricum", 5000.00, 7654321, true));
        personenlijst.add(new Bezorger("Jan", "Rozengracht 488", "1011DS", "Amsterdam", 5000.00, 1234567, false));
        personenlijst.add(new Klant("Amanda", "Commandeurslaan 44", "1962JJ", "Heemskerk"));
        aantalkoks = telKoks();
        System.out.println("Het aantal koks dat werkzaam is bij DamascusShoarma is " + aantalkoks);
        aantalbezorgers = getaantalbezorgers();
        System.out.println("Het aantal bezorgers dat werkzaam is bij DamascusShoarma is " + aantalbezorgers);
        String bestelling = getBestelling(personenlijst.get(4));
    }
    
    public static void main (String[] args) {
    	DamascusShoarma damascus = new DamascusShoarma();
    }
}
 
Het is gelukt :D:D:D:D:D.
Jullie horen zeker nog van mij wat het commentaar en cijfer van de docent is.
Bedankt allemaal.

Voor de liefhebbers nog ff de code van de mainclass:

Code:
/*
 * 	Eerst wordt de ArrayList uit de Java Library utilities gehaald.
 *	Deze gebruiken we om de personen in een array te kunnen zetten.
 *	We gebruiken deze tool om simpel mensen toe te kunnen voegen die ook verschillende statussen hebben.
 */

import java.util.ArrayList;

public class DamascusShoarma {

/*
 *	We gebruiken private variabelen omdat deze variabelen niet buiten de class gebruikt hoeven te worden.
 *	Op deze manier voorkom je dat eventuele andere programmeurs dat doen of dat je zelf de mist in gaat.
 */
	private int aantalkoks;
    private int aantalbezorgers;
    private ArrayList<Personen> personenlijst = new ArrayList<Personen>();

/*
 *	Hieronder maken we een method die zorgt voor het tellen van het aantal koks
 *	dat de Shoarmazaak in dienst heeft.
 *	We maken hierbij gebruik van de eerder aangemaakte ArrayList.
 */  
    public int telKoks() {
        int koks = 0;
        Kok kok = new Kok();
        for(int i = 0; i < personenlijst.size()-1; i++){
            if(personenlijst.get(i).getClass().equals(kok.getClass())){
                koks++;
            }
        }
        return koks;
    }

/*
 *	Dezelfde method als hierboven wordt gebruikt voor het tellen van het aantal bezorgers
 *	dat de zaak in dienst heeft.
 */
     
    public int getaantalbezorgers() {
        int bezorgers = 0;
        Bezorger bezorger = new Bezorger();
        for(int i = 0; i < personenlijst.size()-1; i++){
            if(personenlijst.get(i).getClass().equals(bezorger.getClass())){
                bezorgers++;
            }
        }
        return bezorgers;
    }

/*
 *	De method getBestelling zorgt er voor dat de naam van de klant die een bestelling heeft geplaatst
 *	geprint wordt.
 */
 
    public String getBestelling(Klant a){
    	return a.getNaam() + " heeft een broodje besteld";
	}

/* 
 *	Hieronder volgt de constructor van deze main class.
 *	Dit is eigenlijk de motor van het programma.
 *	Deze constructor zorgt voor alle pints op het scherm na het compilen.
 */
     
    public DamascusShoarma(){
        personenlijst.add(new Kok("Jonny", "Singel 23", "1234AB", "Heemskerk", 10000.00, 2461357));
        personenlijst.add(new Kok("Berend", "Kleidreef 222", "4321BA", "Beverwijk", 10000.00, 1357246));
        personenlijst.add(new Bezorger("Klaas", "Tulpstraat 45", "6446JF", "Castricum", 5000.00, 7654321, true));
        personenlijst.add(new Bezorger("Jan", "Rozengracht 488", "1011DS", "Amsterdam", 5000.00, 1234567, false));
        personenlijst.add(new Klant("Amanda", "Commandeurslaan 44", "1962JJ", "Heemskerk"));
        aantalkoks = telKoks();
        System.out.println("Het aantal koks dat werkzaam is bij DamascusShoarma is " + aantalkoks);
        aantalbezorgers = getaantalbezorgers();
        System.out.println("Het aantal bezorgers dat werkzaam is bij DamascusShoarma is " + aantalbezorgers);
        System.out.println(getBestelling((Klant)personenlijst.get(4)));;
    }
    
    public static void main (String[] args) {
    	DamascusShoarma damascus = new DamascusShoarma();
    }
}
 
Javadoc is een in java geïntegreerde mogelijkheid om een eigen uitleg bij public/protected methodes te maken voor als iemand anders jouw class gebruikt.
Hier ook een kleine uitleg + visualisatie:
http://en.wikipedia.org/wiki/Javadoc

Welke IDE (programma om in de coden) gebruik je ook al weer?
 
Laatst bewerkt:
Allen nogmaals bedankt.
Hieronder het commentaar van de docent op de opgave en het cijfer.
Een 8 :D top.

Beste cursist Schalkwijk,

De programmeeropdracht is goed uitgewerkt.

Pluspunten:
+ De inheritance is volgens de modeluitwerking
+ Commentaar is ruim aanwezig
+ Syntax this.<variabele>
+ Implementatie van tellen
+ Tevredenheid klant is over nagedacht

Kanttekening:
- Bij Kok en Bezorger geen getters en setters.
- De aanroep package ontbreekt.
- Classes die niet aangemaakt worden abstract maken (met protected constructors).
- Let op het gebruik van private en public. Een getter of setter is public, de onderliggende variabele private.
- De methode tevreden() ontbreekt.

Opmerkingen:
> Objecten tellen kan ook via een static tellertje gebeuren. Dit komt wel pas in hoofdstuk 10 aan de orde.

Zoek op '///' voor wijzigingen in de code.

Opgave 2 heeft een score van 37,5 uit 50.
Code: score 85 uit 100.
Totale score 122,5 uit 150.

Eindcijfer: 8
 
Netjes gedaan :thumb:

Alleen dit commentaar:
- Bij Kok en Bezorger geen getters en setters.

Als hij bedoelt dat deze niet in de class zelf staan dan klopt deze dacht ik niet helemaal...
Want als ik het mij nog goed herinner erven die classes de getters en setters van de superclass.
En die getters en setters zitten dan in de personenclass..
 
Laatst bewerkt:
Een dringende vraag

- Bij Kok en Bezorger geen getters en setters.
- De aanroep package ontbreekt.
- Classes die niet aangemaakt worden abstract maken (met protected constructors).
- Let op het gebruik van private en public. Een getter of setter is public, de onderliggende variabele private.
- De methode tevreden() ontbreekt.

Wat wordt bedoelt met "Classes die niet aangemaakt worden abstract maken (met protected constructors).".
Hoe kan dit worden gerealiseerd?
 
Wat wordt bedoelt met "Classes die niet aangemaakt worden abstract maken (met protected constructors).".
Hoe kan dit worden gerealiseerd?

Een abstracte klasse is een klasse waarvan er nooit expliciet een object van kan aangemaakt worden. M.a.w. als Object een abstracte klasse is kan je niet gewoon Object p = new Object( ) doen. Vermits dit fout is. Je kan zo'n klasse enkel gebruiken m.b.v. inheritance.
Je kan dit verwezenlijke door bijvoorbeeld
PHP:
public abstract class Object { }
te gebruiken.

Wat is het nut hiervan? Stel je wilt de speelstukken van een schaakspel implementeren. Deze hebben bepaalde functies en member variabelen gelijk ( kleur, type, .. + get en set functies ).
Dan is het handig 1 abstracte klasse SpeelStuk te maken en daar dan de andere speelstukken van af te leiden, bv Koning, Paard, .... Je kan dan in die abstracte klasse nog eens ValidMoves als abstracte functie zetten. ( een functie die in de subklasse geimplementeerd wordt).

Eens alle speelstukken gemaakt zijn kan je gewoon een array van het type Speelstuk bijhouden om in de rest van het programma te gebruiken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan