29. december 2000 - 19:48Der er
14 kommentarer og 1 løsning
problem med klasser
Hej, Jeg sidder med en opgave-se nedenfor- men jeg kan simpelthen ikke visualisere hvordan klasserne skal se ud.. er det banalt eller er det mig eller ? Please hjælp. Jeg går ud fra at hver sin drik skal have sin klasse med attributter som pris og maengde, da dette er forskelligt for hver drik. Men jeg kan ikke se om der her er tale om noget arv ? eller lister ? Det er muligt at der er nogen der har set denne opgave før, da den er fra et eksamenssæt fra en eksamen på datamatiker.
_____________________________________________ Varm drikautomat. Et firma ved navn HotnTasty har fremstillet en automat til servering af varme drikke. Automaten skal kunne servere følgende drikke: kaffe, te, chokoloade og bouillon.
Alle drikkene er vandbaserede og har en individuel pris. Mængden af varm drik og dermed af vand er ligeledes individuel. Udover vand indeholder drikkene et pulver, der giver smagen.
Automaten skal kunne føre statistik over, hvor mange kopper af de forskellige drikke den har serveret.
spg. a
Opstil den eller de klasser, med angivelse af data- og metodebehov, der skal til for at modellere de ovenfor beskrevne varme drikke
spg. b
Hvor længe behøver et objekt af en varm kop varm drik at eksistere i systemet? Begrund svaret.
spg. c
Realiser klassehierarkiet fra spg. a. Du kan forudsætte, at du har en klasse Automat med flg. metoder til din rådighed, som du blot kan kalde for at få automaten til at udføre en handling: void tilsætPulver (String type) hvor type kan være \"Kaffe\", \"The\", \"Chokolade\" eller \"bouillon\". void tilsætmaengde (int maengde) hvor mængde er i cl
Disse to metoder skal du ikke implementere, men hvis du tilføjere yderligere metoder til Automat, skal de ekstra metoder implementeres.
spg. a: Firmaet HotnTasty ville måske være en oplagt klasse, hvis ikke det lige var fordi, den ligger udenfor opgaven. Men Automat er da helt oplagt; det er jo sådan en størrelse der serverer de forskellige drikke. Kaffe, Te m.m. er også helt oplagte - det står jo i opgaven!!! Og at de alle sammen er varme drikke gør det jo ligeså oplagt, at du nok skal have en superklasse - vi kunne jo kalde den VarmDrik - som de varme drikke skal være subklasser til.
En god måde man kan bruge som nybegynder er at skrive alle navneord i programbeskrivelsen på en liste. Denne liste indeholder så de klasser der skal laves. Dette er en grov måde, men god hvis man har svært ved at opfatte programmer objekt-opdelt.
Start med klassen Automat. Tegn derunder klassen VarmDrik, og forbind de to med en aggregering. I Automat enden af aggregeringen - den ende med diamanten - skriver du \"1\" og i VarmDrik enden skriver du \"0..*\". Disse kardinaliteter angiver, at en automat kan servere 0 til mange varme drikke, og at en varm drik kommer fra én automat.
Placer klasserne for de konkrete typer af varme drikke - altså Kaffe m.m. - på en række under VarmDrik og forbind de fire varme drikke med VarmDrik med generaliseringer.
Endelig skal du skrive VarmDrik med kursiv for at markere at det er en abstrakt klasse, og så er version 1 af dit klassediagram færdig.
du kan lave en superklasse der f.eks. hedder Drik, og en subklasse af denne for hver enkelt drik. Hvis du så laver en klasse der har en metode til oprettelse af et object af hver subklasse, og som lægger objektet i en liste. Når du så skal lave statistik kan du løbe listen igennem og se om elementet er den ene eller anden subklasse, hvilket samtidig besvarer spg. b.
Yes! Jeg har forsøgt at lave dette med lister, men der opstår et problem på et givet tidspunkt. Det er når jeg skal kalde metoden tilsaetMangde(), der er ingen problemer når jeg skal tilsaetPulver() - dette er egentlig bare en tilfoejElement- metode (push/enqueue) som opretter en ny instans af den klasse, der svarer til den streng (type) den får med som parameter. Programmet er iøvrigt langt nu, da hver drik-klasse (arver fra en superklasse) modellerer et element i en hægtet liste.
jeg bruger de forskellige klasser (kaffe, the osv) som \"noder\"/\"elementer\" der har en next-reference i sig og en reference til sig selv. Jeg bruger automat til tilSaetpulver metoderne, public void tilsaetPulver (String type) { if (type.equalsIgnoreCase(\"Kaffe\")) Kaffe k = new Kaffe(); } men hvis jeg opretter et objekt til af samme \"type\" under tilsaetMaengde er der jo ingen der ved om den maengde tilhører objektet kaffe..
Hvis du nu f.eks. har lavet typen public abstract class VarmDrik { public abstract void tilsætMængde(); ... } og du så nedarver fra VarmDrik i de klasser der repræsenterer den enkelte type drik public class Kaffe extends VarmDrik { public void tilsætMængde() { vandMængde = 20; } private int vandMængde; ... } så kan du udnytte polymorfien i dine klasser til at tilsætte den rigtige mængde vand til din kaffe. I Automat ændrer du tilsætPulver, så den instantierer et objekt af en af de konkrete typer og tildeler det til en variabel af den abstrakte superklasse public class Automat { // Her har du en eller anden container, der indeholder de serverede varme drikke // det skal IKKE være et array som her; find selv på en bedre container private VarmDrik[] drikke; public Automat() { drikke = new VarmDrik[1000]; // Her ses tydeligt, hvorfor du skal finde en anden container } public void lavDrik(final String type) { VarmDrik drik = tilsætPulver(type); drik.tilsætMængde(); drikke.add(drik); // eller noget tilsvarende, der passer til den container, du har valgt } private VarmDrik tilsætPulver(final String type) { if (type.equalsIgnoreCase(\"Kaffe\")) { VarmDrik resultat = new Kaffe(); } ... return resultat; } }
Nu er returværdien for metoden tilsætPulver ændret og metoden tilsætMængde ligger ikke længere i klassen Automat, men er flyttet ud til de varme drikke. Du behøver ikke at have dårlig samvittighed over ikke at holde dig præcist til opgaveformuleringen hvis du finder svagheder i den (og dem har du jo fundet), men du skal huske i dit svar at gøre det klart hvorfor du ikke har holdt dig til det der står i spørgsmål c.
Jeg har været så nervøs både før og efter min eksamen, at jeg nu, efter eksamen overhovedt ikke har kigget på noget java.... jeg forstår stadig ikke denne opgave, men det skylder mit manglende overblik generelt, jeg synes heller ikke det er en god opgave, men det er jo en dårlig undskyldning. Sorry.
Næ, jeg arbejder ikke videre med denne opgave, da jeg synes den er dum.
Det er da en god grund. Jeg kunne sikkert godt løse den nu, men det er bare kedeligt at vende tilbage til den...
Hvis det har din interesse roder jeg med avancerede datastrukturer i øjeblikket, så det er ikke fordi jeg har gjort det nemmere for mig selv, men man er jo nødt til at komme videre på en eller anden måde.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.