Algemene Toegangsmodificatoren
Je bent waarschijnlijk al bekend met het sleutelwoord public
. Dit is een toegangsmodifier die bepaalt waar een bepaalde klasse, methode of een veld toegankelijk is.
Op vergelijkbare wijze zijn er termen zoals private
en protected
. Beide termen kunnen worden gebruikt om de toegankelijkheid van een methode of een veld te specificeren.
Wanneer je public
voor een klasse plaatst, wordt de klasse eenvoudigweg toegankelijk vanuit verschillende delen (bestanden) van het programma. Je hoeft dat aspect niet in detail te onderzoeken, aangezien dit buiten de scope van dit hoofdstuk valt.
Wanneer je een methode of een veld als public
specificeert, maak je die eigenschap van de klasse in feite overal binnen de code toegankelijk via een object:
index.cs
1234567891011121314151617181920212223using System; public class Point { public int x; public int y; public Point(int x, int y) { this.x = x; this.y = y; } } class ConsoleApp { static void Main() { Point p = new Point(7, 9); // We can directly access 'public' fields of an object using the dot '.' symbol Console.WriteLine(p.x); Console.WriteLine(p.y); } }
Als je niet wilt dat een veld of een methode van een object buiten de klasse toegankelijk is, kun je deze eenvoudigweg private
maken:
index.cs
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748using System; class Point { public int x; public int y; private double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } // A private method can only be used inside the class. // Trying to use a private method outside the class might result in a compilation error. private double calculateMagnitude() { // Math.Sqrt() is the square root function. return Math.Sqrt(x * x + y * y); } // Sometimes, to be able to access data from a private field, we make public methods // which specifically retrieve the value of that field. Such methods are called "getters", // and such fields are called "read-only" fields as we can access their data but cannot modify it from outside the class. public double getMagnitude() { return magnitude; } } class ConsoleApp { static void Main() { Point p = new Point(7, 9); // Correct Console.WriteLine(p.getMagnitude()); // Error Console.WriteLine(p.calculateMagnitude()); // Error Console.WriteLine(p.magnitude); } }
Het is belangrijk op te merken dat de private velden en methoden niet worden geërfd door afgeleide klassen:
index.cs
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253using System; class Point { public int x; public int y; private double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } private double calculateMagnitude() { // Math.Sqrt() is the square root function. return Math.Sqrt(x * x + y * y); } public double getMagnitude() { return magnitude; } } class Point3D : Point { public int z; // The 'base(x, y)' part simply calls the constructor of the 'Point' class with 'x' and 'y' values. // This will be more thoroughly explained in the later section. public Point3D(int x, int y, int z) : base(x, y) { this.z = z; // Error calculateMagnitude(); } } class ConsoleApp { static void Main() { Point3D p = new Point3D(5, 7, 9); // Correct according to rules of language, however note that it will give the magnitude of x and y excluding z (for a 2D point) so logically the result will be wrong Console.WriteLine(p.getMagnitude()); } }
Om een veld of methode ontoegankelijk te maken van buiten de klasse, maar wel toegankelijk voor afgeleide klassen, kan het sleutelwoord protected
worden gebruikt:
index.cs
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950using System; class Point { public int x; public int y; protected double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } protected double calculateMagnitude() { // Math.Sqrt() is the squareroot function. return Math.Sqrt(x * x + y * y); } public double getMagnitude() { return magnitude; } } class Point3D : Point { public int z; public Point3D(int x, int y, int z) : base(x, y) { this.z = z; // No Error Now calculateMagnitude(); } } class ConsoleApp { static void Main() { Point3D p = new Point3D(5, 7, 9); Console.WriteLine(p.getMagnitude()); } }
Soms worden er publieke methoden aangemaakt, zogenaamde getters, om toegang te krijgen tot private attributen van een klasse. De methode getMagnitude
is een voorbeeld van een getter. Dit zorgt ervoor dat het veld alleen leesbaar is en niet beschrijfbaar, waardoor dat attribuut alleen-lezen wordt.
Als er geen toegangsmodifier is gespecificeerd voor een klasse-lid, wordt deze standaard als private
beschouwd.
1. Welke toegangsmodifier zorgt ervoor dat een lid alleen toegankelijk is binnen de klasse waarin het is gedefinieerd?
2. Hoe kan een klasse-attribuut ontoegankelijk worden gemaakt van buitenaf?
3. Wat is een goede manier om de waarden van private velden van buiten de klasse te benaderen?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 2.04
Algemene Toegangsmodificatoren
Veeg om het menu te tonen
Je bent waarschijnlijk al bekend met het sleutelwoord public
. Dit is een toegangsmodifier die bepaalt waar een bepaalde klasse, methode of een veld toegankelijk is.
Op vergelijkbare wijze zijn er termen zoals private
en protected
. Beide termen kunnen worden gebruikt om de toegankelijkheid van een methode of een veld te specificeren.
Wanneer je public
voor een klasse plaatst, wordt de klasse eenvoudigweg toegankelijk vanuit verschillende delen (bestanden) van het programma. Je hoeft dat aspect niet in detail te onderzoeken, aangezien dit buiten de scope van dit hoofdstuk valt.
Wanneer je een methode of een veld als public
specificeert, maak je die eigenschap van de klasse in feite overal binnen de code toegankelijk via een object:
index.cs
1234567891011121314151617181920212223using System; public class Point { public int x; public int y; public Point(int x, int y) { this.x = x; this.y = y; } } class ConsoleApp { static void Main() { Point p = new Point(7, 9); // We can directly access 'public' fields of an object using the dot '.' symbol Console.WriteLine(p.x); Console.WriteLine(p.y); } }
Als je niet wilt dat een veld of een methode van een object buiten de klasse toegankelijk is, kun je deze eenvoudigweg private
maken:
index.cs
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748using System; class Point { public int x; public int y; private double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } // A private method can only be used inside the class. // Trying to use a private method outside the class might result in a compilation error. private double calculateMagnitude() { // Math.Sqrt() is the square root function. return Math.Sqrt(x * x + y * y); } // Sometimes, to be able to access data from a private field, we make public methods // which specifically retrieve the value of that field. Such methods are called "getters", // and such fields are called "read-only" fields as we can access their data but cannot modify it from outside the class. public double getMagnitude() { return magnitude; } } class ConsoleApp { static void Main() { Point p = new Point(7, 9); // Correct Console.WriteLine(p.getMagnitude()); // Error Console.WriteLine(p.calculateMagnitude()); // Error Console.WriteLine(p.magnitude); } }
Het is belangrijk op te merken dat de private velden en methoden niet worden geërfd door afgeleide klassen:
index.cs
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253using System; class Point { public int x; public int y; private double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } private double calculateMagnitude() { // Math.Sqrt() is the square root function. return Math.Sqrt(x * x + y * y); } public double getMagnitude() { return magnitude; } } class Point3D : Point { public int z; // The 'base(x, y)' part simply calls the constructor of the 'Point' class with 'x' and 'y' values. // This will be more thoroughly explained in the later section. public Point3D(int x, int y, int z) : base(x, y) { this.z = z; // Error calculateMagnitude(); } } class ConsoleApp { static void Main() { Point3D p = new Point3D(5, 7, 9); // Correct according to rules of language, however note that it will give the magnitude of x and y excluding z (for a 2D point) so logically the result will be wrong Console.WriteLine(p.getMagnitude()); } }
Om een veld of methode ontoegankelijk te maken van buiten de klasse, maar wel toegankelijk voor afgeleide klassen, kan het sleutelwoord protected
worden gebruikt:
index.cs
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950using System; class Point { public int x; public int y; protected double magnitude; public Point(int x, int y) { this.x = x; this.y = y; this.magnitude = calculateMagnitude(); } protected double calculateMagnitude() { // Math.Sqrt() is the squareroot function. return Math.Sqrt(x * x + y * y); } public double getMagnitude() { return magnitude; } } class Point3D : Point { public int z; public Point3D(int x, int y, int z) : base(x, y) { this.z = z; // No Error Now calculateMagnitude(); } } class ConsoleApp { static void Main() { Point3D p = new Point3D(5, 7, 9); Console.WriteLine(p.getMagnitude()); } }
Soms worden er publieke methoden aangemaakt, zogenaamde getters, om toegang te krijgen tot private attributen van een klasse. De methode getMagnitude
is een voorbeeld van een getter. Dit zorgt ervoor dat het veld alleen leesbaar is en niet beschrijfbaar, waardoor dat attribuut alleen-lezen wordt.
Als er geen toegangsmodifier is gespecificeerd voor een klasse-lid, wordt deze standaard als private
beschouwd.
1. Welke toegangsmodifier zorgt ervoor dat een lid alleen toegankelijk is binnen de klasse waarin het is gedefinieerd?
2. Hoe kan een klasse-attribuut ontoegankelijk worden gemaakt van buitenaf?
3. Wat is een goede manier om de waarden van private velden van buiten de klasse te benaderen?
Bedankt voor je feedback!