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

public class Parent
{
}
De Childklasse erft de Parentklasse met behulp van het extendstrefwoord.
public class Child extends Parent
{
}

Voorbeeld 2 — met behulp van de variabelen van de bovenliggende klasse

public class Parent
{
  public int age;
  public String name;
}
De klasse kan de velden en van de klasse Childgebruiken alsof ze in de klasse zelf zijn gedeclareerd.agenameParentChild
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

Voorbeeld 3 — methoden van de bovenliggende klasse gebruiken

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
De Childklasse kan de variabelen en methoden van de klasse Parent gebruiken alsof ze in de Childklasse zijn gedeclareerd. In dit voorbeeld gebruiken we de getName()methode.
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

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);
   }
}
Zo Childziet de klasse eruit vanuit het oogpunt van de compiler


2. Methode overschrijven

Soms zijn er situaties waarin we onze Childklasse een zeer bruikbare Parentklasse 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 Childklasse declareren we gewoon een methode met dezelfde handtekening als de methode in de Parentklas en schrijven we er vervolgens onze eigen code in.

Voorbeeld 1 — methode overschrijven

public class Parent
{
   public String name;
   public void setName(String nameNew) {
      name = nameNew;
   }

   public getName() {
      return name;
   }
}
De printInfo()methode zal de volgende zin weergeven:
Luke, No!!!
public class Child extends Parent
{
   public void setName(String nameNew) {
      name = nameNew + ", No!!!";
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

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:
public class Child extends Parent
{
   public String name;    // An inherited variable

   public void setName(String nameNew)  // The overridden method replaces the inherited one
   {
      name = nameNew + ", No!!!";
   }

   public getName()    // An inherited method
   {
      return name;
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

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 Parentklasse aan.

Als de printInfo()methode op een object wordt aangeroepen Child, roept deze op zijn beurt de getName()methode van de Childklasse aan.

Met andere woorden, de printInfo()methode wordt alleen in de Parentklasse gedeclareerd, maar roept de getName()methode van de Childklasse aan als de printInfo()methode op een Childobject wordt aangeroepen.

Voorbeeld:

Parent parent = new Parent();
parent.printnInfo();
Deze code toont de volgende tekst op het scherm:
Luke
Child child = new Child();
child.printnInfo();
Deze code toont de volgende tekst op het scherm:
Luke, I am your father

En dat allemaal omdat vanuit het oogpunt van de compiler (een zeer vereenvoudigde versie ervan), de code van de Childklasse er als volgt uitziet:

public class Child extends Parent
{
   public getName() {
      return "Luke, I am your father";
   }

   public void printInfo()
   {
      System.out.println(getName());
   }
}
Zo Childziet 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>();
Een nieuwe makenArrayList

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
ArrayList<String> list = new ArrayList<String>();
Een nieuwe lijst met tekenreeksen maken
list.add("name");
Voeg een element toe aan het einde van de lijst
list.add(0, "name");
Voeg een element toe aan het begin van de lijst
String name = list.get(5);
Krijg een element door zijn index
list.set(5, "new name");
Verander een element door zijn index
int count = list.size();
Verkrijg het aantal elementen in de lijst
list.remove(4);
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 Randomklasse uit het java.utilpakket, 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 -10tot en +10met. Dit kan met code als volgt:

int dx = getRandomNumber(-10, 11);

Deze methode retourneert een willekeurig geheel getal in het bereik -10tot +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.