Contenu du cours
C# au-delà des Bases
C# au-delà des Bases
Modificateurs d'Accès Communs
Vous êtes peut-être déjà familier avec le mot-clé public
. C'est un modificateur d'accès qui définit où une certaine classe, méthode ou un champ peut être accédé.
De même, il existe des termes comme private
et protected
. Ces deux termes peuvent être utilisés pour spécifier l'accessibilité d'une méthode ou d'un champ.
Lorsque nous écrivons public
avant une classe, cela rend simplement la classe accessible depuis différentes parties (fichiers) du programme. Nous n'avons pas besoin d'explorer cet aspect en détail car il est hors du cadre de ce chapitre.
Lorsque nous spécifions une méthode ou un champ comme public
, nous rendons essentiellement cette propriété de la classe accessible de n'importe où dans le code via un objet :
index
using 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); } }
Si nous ne voulons pas qu'un champ ou une méthode d'un objet soit accessible en dehors de la classe, nous pouvons simplement le rendre private
:
index
using 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); } }
Il est important de noter que les champs et méthodes privés ne sont pas hérités par les classes dérivées :
index
using 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()); } }
Pour rendre un champ ou une méthode inaccessible depuis l'extérieur de la classe mais accessible depuis les classes enfants, nous utilisons le mot-clé protected
:
index
using 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()); } }
Parfois, pour pouvoir accéder aux attributs privés d'une classe, nous créons des méthodes publiques appelées getters. La méthode getMagnitude
est un exemple de getter. Cela garantit que le champ est uniquement lisible et non modifiable, rendant cet attribut en lecture seule.
Remarque : Si aucun modificateur d'accès n'est spécifié pour un membre de classe, il est supposé être private
par défaut.
1. Quel modificateur d'accès permet à un membre d'être accessible uniquement au sein de sa classe définissante ?
2. Comment rendre un attribut de classe inaccessible de l'extérieur ?
3. Quelle est une bonne façon d'accéder aux valeurs des champs privés depuis l'extérieur de la classe ?
Merci pour vos commentaires !