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 Child arver Parent klassen ved hjelp av nøkkelordet extends . |
|
Eksempel 2 — ved å bruke variablene til den overordnede klassen
|
Klassen Child kan bruke age og- name feltene til klassen Parent som om de var deklarert i Child selve klassen. |
|
Eksempel 3 - ved å bruke metoder fra overordnet klasse
|
Klassen Child kan 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);
}
}
Child
ser klassen ut fra kompilatorens synspunkt
2. Metodeoverstyring
Noen ganger er det situasjoner der vi får klassen vår Child
til å arve en veldig nyttig Parent
klasse, 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 Child
klassen vår erklærer vi ganske enkelt en metode med samme signatur som metoden i klassen Parent
og 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 Parent
type, kaller den igjen getName()
metoden til Parent
klassen.
Hvis printInfo()
metoden kalles på et Child
objekt, kaller den igjen getName()
metoden til Child
klassen.
Metoden er med andre ord printInfo()
kun deklarert i Parent
klassen, men den kaller getName()
metoden til Child
klassen hvis printInfo()
metoden kalles på et Child
objekt.
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), Child
ser 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());
}
}
Child
ser 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 Random
klassen fra java.util
pakken, 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 -10
til +10
inklusive. Dette kan gjøres med kode som dette:
int dx = getRandomNumber(-10, 11);
Denne metoden vil returnere et tilfeldig heltall i området -10
til +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