Korte samenvatting

  • Abstraction houdt grofweg in dat je je code zo gebruiksvriendelijk mogelijk maakt voor een programmeur die gebruikmaakt van jouw code.
  • In C++ kun je gebruik maken van drie soorten access identifiers:
    • Public: variabelen en functies binnen een class zijn buiten de class aan te roepen met behulp van een instantie van die class (een object). Daarbij kunnen public variabelen en functies worden overgenomen door derived classes.
    • Private: variabelen en functies binnen een class zijn niet buiten de class aan te roepen met behulp van een instantie van die class. Ook kunnen private variabelen en functies niet worden overgenomen door derived classes.
      • Je zou een stukje private data wel kunnen benaderen buiten de class, maar dan doe je dit door middel van een functie die public staat. Een public functie GetX() zou bijvoorbeeld een waarde x kunnen teruggeven, die dus buiten de class beschikbaar wordt. Dit soort functies worden ook wel Getters genoemd.
      • Je zou een stukje private data uiteraard ook buiten de class kunnen aanpassen door middel van een public functie binnen die class. Dit worden ook wel Setters genoemd.
    • Protected: protected data en functies werken eigenlijk hetzelfde als private data en functies. Het enige verschil is dat protected data en functies wel kunnen worden overgenomen door derived classes. Hoewel deze data wel kan worden overgenomen door derived classes, is het dus enigszins beschermd. Vandaar dan ook de naam ‘protected’.
  • Ontwikkelaars van game engines, zoals Unity en Unreal Engine, zijn voorbeelden van ontwikkelaars die veel gebruik maken van abstraction. De gebruikers van de engine, vooral gameplay programmeurs, maken gebruik van de componenten die engine developers hebben ontwikkeld. Het is alleen niet de bedoeling dat deze onderliggende componenten kunnen worden aangepast door gameplay developers. Dit zou de engine in de knoei kunnen brengen. Daarom is deze data beschermd.

Broncode

Een voorbeeld van protected datagebruik

#include <iostream>

/* GameObject Class */

class GameObject
{
public:
    GameObject() 
    { 
        m_gezondheid = 0.0f; 
    }

protected:
    float m_gezondheid;
};

/* Speler Class */

class Speler : public GameObject
{
public:
    Speler()
    {
        m_gezondheid = 5.0f;
    }

private:
};


/* Monster Class */

class Monster : public GameObject
{
public:
   Monster() 
   {
       m_gezondheid = 10.0f;
   }
    
private:
};

/* Main */

int main(int argc, const char * argv[]) 
{
    Speler speler;
    Monster monster;
}