1. Arv
For å jobbe med CodeGym-spillmotoren, må du bruke arv . Men hva om du ikke vet hva det er? På den ene siden må du forstå og studere dette emnet. På den annen side er motoren spesialdesignet for å være veldig enkel, slik at du kan klare deg med en overfladisk kunnskap om arv.
Så hva er arv? Enkelt sagt er arv et forhold mellom to klasser. En av dem fungerer som foreldreklassen, og den andre blir barneklassen (etterkommer). Dessuten vet kanskje ikke en foreldreklasse at den har etterkommerklasser. Forelderen har med andre ord ikke mye utbytte av å ha etterkommerklasser.
Men arv gir mange fordeler til barneklassen. Den viktigste av dem er at alle variabler og metoder for overordnet klasse vises i barneklassen, som om koden til overordnet klasse ble kopiert direkte inn i barneklassen. Dette er ikke helt nøyaktig, men det vil være tilstrekkelig for en grunnleggende forståelse av arv.
Her er noen eksempler for å hjelpe deg bedre å forstå arv.
Eksempel 1 - her er det enkleste eksemplet
|
Klassen Childarver Parentklassen ved hjelp av nøkkelordet extends. |
|
Eksempel 2 — ved å bruke variablene til den overordnede klassen
|
Klassen Childkan bruke ageog- namefeltene til klassen Parentsom om de var deklarert i Childselve klassen. |
|
Eksempel 3 - ved å bruke metoder fra overordnet klasse
|
Klassen Childkan bruke variablene og metodene til Parent-klassen som om de var deklarert i klassen Child. I dette eksemplet bruker vi getName()metoden. |
|
Ved å utelate noen detaljer kan vi si at fra Java-kompilatorens perspektiv kopierte vi ganske enkelt koden til overordnet klasse inn i koden til barneklassen:
public class Child extends Parent
{
public int age; // An inherited variable
public String name; // An inherited variable
public getName() { // An inherited method
return name;
}
public void printInfo()
{
System.out.println(getName() + " " + age);
}
}
Childser klassen ut fra kompilatorens synspunkt
2. Metodeoverstyring
Noen ganger er det situasjoner der vi får klassen vår Childtil å arve en veldig nyttig Parentklasse, noe som får barnet til å arve alle foreldrenes variabler og metoder. Men noen av disse metodene fungerer kanskje ikke helt slik vi vil at de skal eller ikke i det hele tatt slik vi vil.
Hva gjør du i dette tilfellet? Vi kan overstyre en metode hvis implementering vi ikke liker . Dette er en enkel ting å gjøre: i Childklassen vår erklærer vi ganske enkelt en metode med samme signatur som metoden i klassen Parentog skriver deretter vår egen kode i den.
Eksempel 1 — metodeoverstyring
|
Metoden printInfo()vil vise følgende setning: |
|
Overforenkling av situasjonen noe fører arv til at koden til overordnet klasse blir kopiert inn i barneklassen. Men hvis en etterkommerklasse allerede er en metode som eksisterer i en stamfarklasse, kopieres ikke denne metoden fra stamfarklassen. Her sier vi at metoden i barneklassen overstyrer metoden i foreldreklassen. Se på eksemplet nedenfor. Kanskje det vil bidra til å gjøre ting litt klarere:
| Slik ser Child-klassen ut fra kompilatorens synspunkt: |
|---|
|
Eksempel 2 - litt arvemagi (og metodeoverstyring)
public class Parent
{
public getName() {
return "Luke";
}
public void printInfo()
{
System.out.println( getName() );
}
}
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
}
Hvis printInfo()metoden kalles på en Parenttype, kaller den igjen getName()metoden til Parentklassen.
Hvis printInfo()metoden kalles på et Childobjekt, kaller den igjen getName()metoden til Childklassen.
Metoden er med andre ord printInfo()kun deklarert i Parentklassen, men den kaller getName()metoden til Childklassen hvis printInfo()metoden kalles på et Childobjekt.
Eksempel:
|
Denne koden viser følgende tekst på skjermen: |
|
Denne koden viser følgende tekst på skjermen: |
Og alt fordi fra kompilatorens synspunkt (en veldig forenklet versjon av den), Childser koden til klassen slik ut:
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
public void printInfo()
{
System.out.println(getName());
}
}
Childser klassen ut fra kompilatorens synspunkt
3. Lister
Her er en kort påminnelse om lister ( List). Lister har mye til felles med matriser:
- De kan lagre mye data av en bestemt type.
- De lar deg få elementer etter indeksen deres.
- Indeksene til elementene starter på
0.
Fordeler med lister:
I motsetning til matriser, kan lister dynamisk endre størrelse. Umiddelbart etter opprettelsen er størrelsen på en liste 0. Etter hvert som elementer legges til i listen, øker størrelsen. Eksempel på å lage en liste:
ArrayList<String> myList = new ArrayList<String>();
ArrayList
Verdien som er angitt i vinkelparentesene er datatypen som listen kan lagre.
Her er noen metoder for å jobbe med en liste:
| Kode | Kort beskrivelse |
|---|---|
|
Opprette en ny liste over strenger |
|
Legg til et element på slutten av listen |
|
Legg til et element i starten av listen |
|
Få et element etter indeksen |
|
Endre et element etter indeksen |
|
Få antall elementer i listen |
|
Fjern et element fra listen |
For mer informasjon om lister kan du lese følgende artikler:
4. Tilfeldige tall
CodeGym-spillmotoren har to metoder som kan brukes til å generere tilfeldige tall. Disse metodene er:
int getRandomNumber(int max)
int getRandomNumber(int min, int max)
Den første metoden — getRandomNumber(int max)— returnerer et tilfeldig tall i området 0, 1, 2, ... max-1. Under panseret bruker den Randomklassen fra java.utilpakken, men det endrer ikke hvordan du bruker et tilfeldig tall.
getRandomNumber(int)godtar et heltall som et argument. Dette tallet vil være den øvre grensen for tallene som tilfeldig tallgeneratoren kan returnere. Den nedre grensen er 0. OBS! Tilfeldig tallgeneratoren vil ALDRI returnere verdien av den øvre grensen. For eksempel, hvis du ringer getRandomNumber(3), vil den tilfeldig returnere enten 0, 1 eller 2. Som du kan se, vil den ikke returnere 3. Å bruke en tilfeldig tallgenerator på denne måten er ganske enkelt, men det passer i mange tilfeller.
Den andre metoden — getRandomNumber(int min, int max)— returnerer et tilfeldig heltall i området [min, max-1]. Den vil aldri returnere et tall mindre enn min, og den vil aldri returnere et tall som er større enn max-1.
Hvordan kan disse metodene brukes i praksis?
1. Terninger
Anta at du vil simulere terningkastet og få et tilfeldig tall i området 1-6. Hvordan ville du gjort det? Dette kan gjøres med kode som dette:
int dice = getRandomNumber(1, 7);
Denne metoden vil returnere et tilfeldig heltall i området 1-6.
2. Måltrening
Anta at du ønsker å simulere skyting mot et mål, og nøyaktigheten til et skudd inkluderer en tilfeldig komponent som varierer i området fra -10til +10inklusive. Dette kan gjøres med kode som dette:
int dx = getRandomNumber(-10, 11);
Denne metoden vil returnere et tilfeldig heltall i området -10til +10.
Det er mange måter å bruke tilfeldige tall på i spill. Du er bare begrenset av fantasien din. Skriv dine egne spill, avgrens dem og nyt prosessen.
Alle kan spille spill, men bare programmerere kan lage dem.
GO TO FULL VERSION