Skip to content

Access modifier

Een access modifier helpt je om het principe van “encapsulation” te implementeren. Dit betekent dat je de toegang tot de variabelen en methoden van een class kunt beperken. Dit is een belangrijk concept in OOP, omdat het je helpt om je code te structureren en te beveiligen.

In de meeste talen zijn er vier access modifiers: public, private, protected en internal.

  • public betekent dat de variabele of methode vanuit elke class toegankelijk is.

Voorbeeld van de ‘public’ access modifier

Definieer de class Aardappel:

class Aardappel {
    public kleur: string;
    public datumGeplant: Date;           
}

Als je nu een object van de class Aardappel aanmaakt, kun je de variabelen kleur en datumGeplant vanuit elke class benaderen:

const kleiBint = new Aardappel();
aardappel.kleur = "rood";
aardappel.datumGeplant = new Date();

Definieer de class Aardappel:

public class Aardappel {
    public string kleur;
    public DateTime datumGeplant;           
}

Als je nu een object van de class Aardappel aanmaakt, kun je de variabelen kleur en datumGeplant vanuit elke class benaderen:

var kleiBint = new Aardappel();
aardappel.kleur = "rood";
aardappel.datumGeplant = DateTime.Now;

Definieer de class Aardappel:

public class Aardappel {
    public String kleur;
    public Date datumGeplant;           
}

Als je nu een object van de class Aardappel aanmaakt, kun je de variabelen kleur en datumGeplant vanuit elke class benaderen:

Aardappel kleiBint = new Aardappel();
aardappel.kleur = "rood";
aardappel.datumGeplant = new Date();

Talen die geen public access modifier hebben, zoals Python en JavaScript, gebruiken public als standaard access modifier. Dit betekent dat je de variabelen en methoden van een class vanuit elke class kunt benaderen.

  • protected betekent dat de variabele of methode alleen vanuit de class zelf of vanuit een sub-class benaderd kan worden.

Voorbeeld van de ‘protected’ access modifier

Definieer de class Aardappel:

class Aardappel {
    protected _kleur: string;
    protected _datumGeplant: Date;           
}

Als je nu een object van de class Aardappel aanmaakt, kun je de variabelen kleur en datumGeplant alleen vanuit de class zelf of vanuit een sub-class benaderen:

class KleiBint extends Aardappel {
    constructor() {
        super();
        this._kleur = "rood"; // Dit mag wel
        this._datumGeplant = new Date(); // en dit ook
    }
}

Als je de variabelen kleur en datumGeplant vanuit een andere class probeert te benaderen, krijg je een foutmelding:

const kleiBint = new Aardappel();
aardappel._kleur = "rood"; // compileerfout
aardappel._datumGeplant = new Date(); // compileerfout

Definieer de class Aardappel:

public class Aardappel {
    protected string _kleur;
    protected DateTime _datumGeplant;           
}

Als je nu een object van de class Aardappel aanmaakt, kun je de variabelen kleur en datumGeplant alleen vanuit de class zelf of vanuit een sub-class benaderen:

public class KleiBint : Aardappel {
    public KleiBint() {
        this._kleur = "rood"; // Dit mag wel
        this._datumGeplant = DateTime.Now; // en dit ook
    }
}

Als je de variabelen kleur en datumGeplant vanuit een andere class probeert te benaderen, krijg je een foutmelding:

var kleiBint = new Aardappel();
aardappel._kleur = "rood"; // compileerfout
aardappel._datumGeplant = DateTime.Now; // compileerfout

Definieer de class Aardappel:

public class Aardappel {
    protected String _kleur;
    protected Date _datumGeplant;           
}

Als je nu een object van de class Aardappel aanmaakt, kun je de variabelen kleur en datumGeplant alleen vanuit de class zelf of vanuit een sub-class benaderen:

public class KleiBint extends Aardappel {
    public KleiBint() {
        this._kleur = "rood"; // Dit mag wel
        this._datumGeplant = new Date(); // en dit ook
    }
}
Als je de variabelen kleur en datumGeplant vanuit een andere class probeert te benaderen, krijg je een foutmelding:
Aardappel kleiBint = new Aardappel();
aardappel._kleur = "rood"; // compileerfout
aardappel._datumGeplant = new Date(); // compileerfout
  • private betekent dat de variabele of methode alleen vanuit de class zelf benaderd kan worden. Dus niet vanuit een sub-class.

Voorbeeld van ‘private’ access modifier

Definieer de class Aardappel:

class Aardappel {
    private _kleur: string;
    private _datumGeplant: Date;           
}

Als je nu een object van de class Aardappel aanmaakt, kun je de variabelen kleur en datumGeplant alleen vanuit de class zelf benaderen. Dit mag dus niet:

const kleiBint = new Aardappel();
aardappel._kleur = "rood"; // compileerfout
aardappel._datumGeplant = new Date(); // compileerfout

Je mag de variabelen zelfs niet vanuit een sub-class benaderen. Dit mag dus ook niet:

class KleiBint extends Aardappel {
    constructor() {
        super();
        this._kleur = "rood"; // compileerfout
        this._datumGeplant = new Date(); // compileerfout
    }
}

Definieer de class Aardappel:

public class Aardappel {
    private string _kleur;
    private DateTime _datumGeplant;           
}

Als je nu een object van de class Aardappel aanmaakt, kun je de variabelen kleur en datumGeplant alleen vanuit de class zelf benaderen. Dit mag dus niet:

var kleiBint = new Aardappel();
aardappel._kleur = "rood"; // compileerfout
aardappel._datumGeplant = DateTime.Now; // compileerfout

Je mag de variabelen zelfs niet vanuit een sub-class benaderen. Dit mag dus ook niet:

public class KleiBint : Aardappel {
    public KleiBint() {
        this._kleur = "rood"; // compileerfout
        this._datumGeplant = DateTime.Now; // compileerfout
    }
}

Definieer de class Aardappel:

public class Aardappel {
    private String kleur;
    private Date datumGeplant;           
}

Als je nu een object van de class Aardappel aanmaakt, kun je de variabelen kleur en datumGeplant alleen vanuit de class zelf benaderen. Dit mag dus niet:

Aardappel kleiBint = new Aardappel();
aardappel.kleur = "rood"; // compileerfout
aardappel.datumGeplant = new Date(); // compileerfout

Je mag de variabelen zelfs niet vanuit een sub-class benaderen. Dit mag dus ook niet:

public class KleiBint extends Aardappel {
    public KleiBint() {
        this.kleur = "rood"; // compileerfout
        this.datumGeplant = new Date(); // compileerfout
    }
}

Waarom access modifiers?

Access modifiers helpen je om het principe van “encapsulation” te implementeren. Dit betekent dat je de toegang tot de variabelen en methoden van een class kunt beperken. Dit is een belangrijk concept in OOP, omdat het je helpt om je code te structureren en te beveiligen.

Structuur

Access modifiers helpen je om de structuur van je code te verbeteren. Als je de toegang tot de variabelen en methoden van een class beperkt, kun je de class als een “black box” beschouwen. Je hoeft je dan niet druk te maken over de interne werking van de class. Je hoeft alleen maar te weten welke input je aan de class moet geven en welke output je van de class kunt verwachten.

Beveiliging

Access modifiers helpen je om je code te beveiligen. Als je de toegang tot de variabelen en methoden van een class beperkt, kun je voorkomen dat andere classes de variabelen en methoden van de class kunnen aanpassen. Dit is belangrijk, omdat je niet wilt dat andere classes de interne werking van je class kunnen verstoren.

Voorbeeld

In het voorbeeld hieronder wordt aangenomen dat de kleur van een aardappel veranderd als deze een bepaalde grootte heeft bereikt. Je mag dus grootte en kleur niet zomaar onafhankelijk van elkaar aanpassen. Je moet de methode groei() aanroepen om de kleur van de aardappel te veranderen.

class Aardappel {

    private _kleur: string;
    private _grootte: number;

    public groei(): void {
        if (this._grootte > 10) {
            this._kleur = "rood";
        }
        else {
            this._kleur = "bruin";
        }
    }
}
Door de variabelen kleur en grootte private te maken, kun je afdwingen dat de methode groei() wordt aangeroepen om de kleur en de grootte van de aardappel te veranderen. Dit is belangrijk, omdat je niet wilt dat de kleur van de aardappel verandert als de grootte niet is veranderd en andersom.