|
RHS |
DiceGame04
I denne øvelse skal vi benytte såvel "interface" som "abstract class" og dermed arv.
Husk at skabe et nyt combine - kopier filer fra DiceGame03.
Ideen er at vi vil udvikle en meget fleksibel implementering af en ScoreList. Væk med den simple highScore - i stedet vil vi kunne registrere et antal resultater.
For rigtigt at spille med musklerne vil vi først udarbejde et interface og dernæst en abstrakt klasse som implementerer de fleste metoder, men lader de mest data-struktur afhængige metoder være abstrakte.
På den måde kan vi danne et antal forskellige klasser som benytter forskellige data-strukturer og måske forskellige "regler", men de vil alle være af samme type idet de arver fra dels den abstrakte klasse og dels interfacet.
Indrømmet - det er måske en lidt søgt implementering, men det illustrerer principperne!
Klassen Game03
Skal blot skifte navn til Game - og hermed skulle vi have fundet et stabilt navn til klassen :)
Klassen IScoreList
Det fælles interface. Benyt følgende retningslinier:
Klassen AbstractScoreList
Definerer en intern tælle-variabel, count.
Implementerer metoderne Clear(), GetAverage(), GetHighScore(), Count(), men lader Add(), GetScore() og SetScore() være abstrakte.
Tip: Selvom vi endnu ikke har defineret en data-struktur kan det lade sig gøre at implementere de metoder som kan udtrykkes ved hjælp af andre metoder. Dvs. i implementeringen af f.eks. Clear() kan du udnytte, at når koden aktiveres sker det fra en sub-klasse, hvor bl.a. metoden SetScore() vil være implementeret.
Klassen ScoreArray
En sub-klasse til AbstractScoreList som definerer et simpelt integer array (int[]) som data-struktur.
Klassens constructor skal tage en int parameter som angiver størrelsen af det ønskede array. Arrayet skal dannes og initialiseres. Da værdien 0 er en mulig score vælges værdien -1 som initialiseringsværdi.
Nu skal de abstrakte metoder endeligt implementeres:
SetScore() må kun ændre en eksisterende værdi - dvs. det skal kontrolleres at indeks-værdien ligger mellem 0 og count (antallet af elementer i arrayet).
GetScore() returnerer en værdi fra arrayet hvis indeks-værdien er gyldig, ellers returneres -1.
Add() tilføjer en værdi i arrayet og optæller count, hvis der vel og mærke er fri plads! I modsat fald slettes ældste (forreste) værdi og der skabes plads til den nye værdi (som sidste værdi).
ToString() (arvet fra Object) returnerer en streng iflg. følgende skabelon der beskriver et array med plads til 5 værdier hvoraf 3 er benyttet: "[8, 2, 6, -1, -1]"
Klassen Player
I stedet for higScore variablen skal en Player nu have en variabel - score - af typen .... ja, hvilken type mon er bedst?
Husk at der nu skal dannes et objekt (i klassens constructor) idet score under alle omstændigheder skal være af en reference-type.
Vi skal også slette property HighScore. I stedet burde der egentlig erklæres en række metoder til at manipulere score-listen, men vi snyder lidt (i hvert fald i første omgang). Erklær variablen score som public så den kan tilgås via enhver reference til et Player objekt!
Husk at rette ToString().
Klassen DiceGame
I stedet for at opdatere highScore skal et spils resultat nu adderes til score-listen.
Efter et spil udskrives de to spilleres score-liste.