Korte samenvatting

  • De definitie van polymorphism is dat je functies uit de base class, die worden overgenomen door ondergeschikte derived classes, worden bewerkt voor de derived classes. Voor de ondergeschikte classes krijgen deze functies zo een andere output. Met andere woorden, de bewerkte functies worden overschreven in de derived classes. Dit noemen we ook wel ‘Method Overriding’
  • In C++ kun je aangeven dat een functie kan worden bewerkt in de derived class, door in de base class het woordje ‘virtual’ voor deze functie te zetten.

Broncode

#include <iostream>

/* GameObject Class */

class GameObject
{
public:
    GameObject() {}
    
    void Lopen()
    {
        std::cout << "Object loopt met snelheid " << m_snelheid << std::endl;
    }
    
    virtual void Update();
        
protected:
    int m_gezondheid;
    float m_snelheid;
};

/* Dier Class */

class Dier : public GameObject
{
public:
    Dier()
    {
        m_gezondheid = 5.0f;
        m_snelheid = 3.0f;
    }
    
    void Grazen()
    {
        std::cout << "Object graast." << std::endl;
    }
    
    void Update()
    {
        Lopen();

        Grazen();
    }
    
private:
};


/* Monster Class */

class Monster : public GameObject
{
public:
    Monster()
    {
        m_gezondheid = 10.0f;
        m_snelheid = 10.0f;
    }
    
    void Aanvallen()
    {
        std::cout << "Object valt aan." << std::endl;
    }
    
    void Update()
    {
	Lopen();

        Aanvallen();
    }
    
private:
};

/* Main */

int main(int argc, const char * argv[]) {
    Monster monster;
    Dier dier;
    
    monster.Update();
    dier.Update();
}

Huiswerk voor deze tutorial

In de vorige tutorial, over inheritance, heb je een programma gemaakt met drie classes: Persoon, Student en Professor. De twee laatstgenoemde classes nemen de functie en variabelen over van de Persoon-class en passen het vervolgens op zichzelf toe. Hoewel de code hier al een stuk effici├źnter mee is geworden, kunnen we de code nog iets verbeteren. We kunnen namelijk de PrintStartJaar- en PrintRichting-functie weghalen en de inhoud hiervan in de Info-functie voegen voor de derived classes. Dit maakt de code iets logischer en overzichtelijker.

# Base Class - Persoon
class Persoon:
  def __init__(self, naam, leeftijd, geslacht):
	self.naam = naam
	self.leeftijd = leeftijd
	self.geslacht = geslacht
	
  def Info(self):
	print("Naam:", self.naam)
	print("Leeftijd:", self.leeftijd)
	print("Geslacht:", self.geslacht, "\n")
		
# Derived Class - Student
class Student(Persoon):
  def __init__(self, naam, leeftijd, geslacht, startJaar):
	super().__init__(naam, leeftijd, geslacht)
	self.startJaar = startJaar
		
  def PrintStartJaar(self):
	print(self.naam, "is begonnen met zijn studie in", str(self.startJaar) + ".\n")

# Derived Class - Professor
class Professor(Persoon):
  def __init__(self, naam, leeftijd, geslacht, studieRichting):
	super().__init__(naam, leeftijd, geslacht)
	self.studieRichting = studieRichting
	
  def PrintRichting(self):
	print("Prof.", self.naam, "geeft les in", self.studieRichting + ".\n")

student = Student("Nick", 19, "Man", 2021)
student.Info();

professor = Professor("Van Beek", 55, "Vrouw", "Computer Science")
professor.Info()

In deze opdracht is het bedoeling dat je polymorphism toepast op de Info-functie. Dit doe je in de programmeertaal Python. Zoek zelf op internet op hoe je polymorphism in Python kunt toepassen. Hiermee train je je onderzoekende vaardigheden, die voor een programmeur heel belangrijk zijn.

  1. Zorg ervoor dat je de Info-functie door middel van polymorphism kunt aanpassen voor de Student- en Professor-class. Pas deze vervolgens aan, zodat de variabelen startJaar en studieRichting ook in binnen deze functie worden geprint, voor respectievelijk de Student- en Professor-class.
  2. Verwijder de PrintStartJaar()- en PrintRichting()-functie. Deze zijn niet meer nodig en nemen nu alleen maar overbodig regels code in beslag.

Oplossing huiswerkopdracht

Voorbeeld output

Voorbeeld code

# Base Class - Persoon
class Persoon:
  def __init__(self, naam, leeftijd, geslacht):
	self.naam = naam
	self.leeftijd = leeftijd
	self.geslacht = geslacht
	
  def Info(self):
	print("Naam:", self.naam)
	print("Leeftijd:", self.leeftijd)
	print("Geslacht:", self.geslacht, "\n")
		
# Derived Class - Student
class Student(Persoon):
  def __init__(self, naam, leeftijd, geslacht, startJaar):
	super().__init__(naam, leeftijd, geslacht)
	self.startJaar = startJaar
		
  def Info(self):
	print("Naam:", self.naam)
	print("Leeftijd:", self.leeftijd)
	print("Geslacht:", self.geslacht)
	print("Startjaar:", self.startJaar, "\n")
		
# Derived Class - Professor
class Professor(Persoon):
  def __init__(self, naam, leeftijd, geslacht, studieRichting):
	super().__init__(naam, leeftijd, geslacht)
	self.studieRichting = studieRichting
	
  def Info(self):
	print("Naam:", self.naam)
	print("Leeftijd:", self.leeftijd)
	print("Geslacht:", self.geslacht)
	print("Studierichting:", self.studieRichting, "\n")

student = Student("Nick", 19, "Man", 2021)
student.Info();

professor = Professor("Van Beek", 55, "Vrouw", "Computer Science")
professor.Info()