1. Overerving
Om met de CodeGym-game-engine te werken, moet u overerving gebruiken . Maar wat als je niet weet wat dat is? Aan de ene kant moet je dit onderwerp wel begrijpen en bestuderen. Aan de andere kant is de motor speciaal ontworpen om heel eenvoudig te zijn, zodat je kunt rondkomen met een oppervlakkige kennis van overerving.
Dus wat is erfrecht? In eenvoudige bewoordingen is overerving een relatie tussen twee klassen. Een van hen fungeert als de bovenliggende klasse en de andere wordt de onderliggende (nakomeling) klasse. Bovendien weet een bovenliggende klasse mogelijk niet eens dat deze afstammelingenklassen heeft. Met andere woorden, de ouder heeft niet veel baat bij het hebben van afstammelingenklassen.
Maar overerving geeft veel voordelen aan de kindklasse. De belangrijkste daarvan is dat alle variabelen en methoden van de bovenliggende klasse in de onderliggende klasse verschijnen, alsof de code van de bovenliggende klasse rechtstreeks naar de onderliggende klasse is gekopieerd. Dit is niet helemaal juist, maar het is voldoende voor een basiskennis van overerving.
Hier zijn enkele voorbeelden om u te helpen erfelijkheid beter te begrijpen.
Voorbeeld 1 — hier is het eenvoudigste voorbeeld
|
De Child klasse erft de Parent klasse met behulp van het extends trefwoord. |
|
Voorbeeld 2 — met behulp van de variabelen van de bovenliggende klasse
|
De klasse kan de velden en van de klasse Child gebruiken alsof ze in de klasse zelf zijn gedeclareerd.age name Parent Child |
|
Voorbeeld 3 — methoden van de bovenliggende klasse gebruiken
|
De Child klasse kan de variabelen en methoden van de klasse Parent gebruiken alsof ze in de Child klasse zijn gedeclareerd. In dit voorbeeld gebruiken we de getName() methode. |
|
Als we enkele details weglaten, kunnen we zeggen dat we vanuit het perspectief van de Java-compiler eenvoudigweg de code van de bovenliggende klasse hebben gekopieerd naar de code van de onderliggende klasse:
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
ziet de klasse eruit vanuit het oogpunt van de compiler
2. Methode overschrijven
Soms zijn er situaties waarin we onze Child
klasse een zeer bruikbare Parent
klasse laten erven, waardoor het kind alle variabelen en methoden van de ouder erft. Maar sommige van die methoden werken misschien niet helemaal zoals we willen of helemaal niet zoals we willen.
Wat doe je in dit geval? We kunnen een methode negeren waarvan de implementatie ons niet aanstaat . Dit is eenvoudig te doen: in onze Child
klasse declareren we gewoon een methode met dezelfde handtekening als de methode in de Parent
klas en schrijven we er vervolgens onze eigen code in.
Voorbeeld 1 — methode overschrijven
|
De printInfo() methode zal de volgende zin weergeven:
|
|
Om de situatie enigszins te versimpelen, zorgt overerving ervoor dat de code van de bovenliggende klasse wordt gekopieerd naar de onderliggende klasse. Maar als een afstammingsklasse al een methode is die bestaat in een voorouderklasse, dan wordt die methode niet gekopieerd van de voorouderklasse. Hier zeggen we dat de methode in de onderliggende klasse de methode in de bovenliggende klasse overschrijft. Kijk naar het onderstaande voorbeeld. Misschien helpt het om het wat duidelijker te maken:
Zo ziet de klasse Child eruit vanuit het standpunt van de compiler: |
---|
|
Voorbeeld 2 - een beetje overervingsmagie (en methode-overheersing)
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";
}
}
Als de printInfo()
methode op een type wordt aangeroepen Parent
, roept deze op zijn beurt de getName()
methode van de Parent
klasse aan.
Als de printInfo()
methode op een object wordt aangeroepen Child
, roept deze op zijn beurt de getName()
methode van de Child
klasse aan.
Met andere woorden, de printInfo()
methode wordt alleen in de Parent
klasse gedeclareerd, maar roept de getName()
methode van de Child
klasse aan als de printInfo()
methode op een Child
object wordt aangeroepen.
Voorbeeld:
|
Deze code toont de volgende tekst op het scherm:
|
|
Deze code toont de volgende tekst op het scherm:
|
En dat allemaal omdat vanuit het oogpunt van de compiler (een zeer vereenvoudigde versie ervan), de code van de Child
klasse er als volgt uitziet:
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
public void printInfo()
{
System.out.println(getName());
}
}
Child
ziet de klasse eruit vanuit het oogpunt van de compiler
3. Lijsten
Hier is een korte herinnering over lijsten ( List
). Lijsten hebben veel gemeen met arrays:
- Ze kunnen veel gegevens van een bepaald type opslaan.
- Ze laten je elementen krijgen door hun index.
- De indices van de elementen beginnen bij
0
.
Voordelen van lijsten:
In tegenstelling tot arrays kunnen lijsten dynamisch van grootte veranderen. Direct na het aanmaken is de grootte van een lijst 0
. Naarmate items aan de lijst worden toegevoegd, neemt de grootte toe. Voorbeeld van het maken van een lijst:
ArrayList<String> myList = new ArrayList<String>();
ArrayList
De waarde tussen punthaken is het gegevenstype dat de lijst kan opslaan.
Hier volgen enkele methoden voor het werken met een lijst:
Code | Korte beschrijving |
---|---|
|
Een nieuwe lijst met tekenreeksen maken |
|
Voeg een element toe aan het einde van de lijst |
|
Voeg een element toe aan het begin van de lijst |
|
Krijg een element door zijn index |
|
Verander een element door zijn index |
|
Verkrijg het aantal elementen in de lijst |
|
Verwijder een element uit de lijst |
Voor meer informatie over lijsten kunt u de volgende artikelen lezen:
4. Willekeurige getallen
De CodeGym-game-engine heeft twee methoden die kunnen worden gebruikt om willekeurige getallen te genereren. Deze methoden zijn:
int getRandomNumber(int max)
int getRandomNumber(int min, int max)
De eerste methode — getRandomNumber(int max)
— retourneert een willekeurig getal in het bereik 0
, 1
, 2
, ... max-1
. Onder de motorkap gebruikt het de Random
klasse uit het java.util
pakket, maar dat verandert niets aan de manier waarop je een willekeurig getal gebruikt.
getRandomNumber(int)
accepteert een geheel getal als argument. Dit getal is de bovengrens van de getallen die de generator voor willekeurige getallen kan retourneren. De ondergrens is 0. Let op! De generator voor willekeurige getallen zal NOOIT de waarde van de bovengrens retourneren. Als u bijvoorbeeld aanroept getRandomNumber(3)
, zal het willekeurig 0, 1 of 2 retourneren. Zoals u kunt zien, zal het geen 3 retourneren. Het op deze manier gebruiken van een generator voor willekeurige getallen is vrij eenvoudig, maar het is geschikt voor veel gevallen.
De tweede methode — getRandomNumber(int min, int max)
— retourneert een willekeurig geheel getal in het bereik [min, max-1]
. Het zal nooit een getal kleiner dan teruggeven min
, en het zal nooit een getal groter dan teruggeven max-1
.
Hoe kunnen deze methoden in de praktijk worden gebruikt?
1. Dobbelstenen
Stel dat u de worp van een dobbelsteen wilt simuleren en een willekeurig getal in het bereik wilt krijgen 1-6
. Hoe zou jij het doen? Dit kan met code als volgt:
int dice = getRandomNumber(1, 7);
Deze methode retourneert een willekeurig geheel getal in het bereik 1-6
.
2. Schietoefeningen
Stel dat u het schieten op een doel wilt simuleren, en de nauwkeurigheid van een schot bevat een willekeurige component die varieert in het bereik van -10
tot en +10
met. Dit kan met code als volgt:
int dx = getRandomNumber(-10, 11);
Deze methode retourneert een willekeurig geheel getal in het bereik -10
tot +10
.
Er zijn veel manieren om willekeurige getallen in games te gebruiken. Je wordt alleen beperkt door je fantasie. Schrijf je eigen spellen, verfijn ze en geniet van het proces.
Iedereen kan games spelen, maar alleen programmeurs kunnen ze maken.