Modificadores de Acceso Comunes
Es posible que ya estés familiarizado con la palabra clave public
. Es un modificador de acceso que define desde dónde se puede acceder a una clase, método o campo.
De manera similar, existen términos como private
y protected
. Ambos pueden utilizarse para especificar la accesibilidad de un método o un campo.
Cuando escribes public
antes de una clase, simplemente haces que la clase sea accesible desde diferentes partes (archivos) del programa. No es necesario profundizar en ese aspecto, ya que está fuera del alcance de este capítulo.
Cuando especificas un método o un campo como public
, básicamente haces que esa propiedad de la clase sea accesible desde cualquier parte del código a través de un objeto:
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); } }
Si no deseas que un campo o método de un objeto sea accesible fuera de la clase, simplemente podemos declararlo como private
:
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); } }
Es importante señalar que los campos y métodos privados no son heredados por las clases derivadas:
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()); } }
Para hacer que un campo o método sea inaccesible desde fuera de la clase pero accesible desde las clases derivadas, se puede utilizar la palabra clave protected
:
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()); } }
En ocasiones, para poder acceder a atributos privados de una clase, se crean métodos públicos llamados getters. El método getMagnitude
es un ejemplo de getter. Esto garantiza que el campo solo sea legible y no modificable, haciendo que dicho atributo sea de solo lectura.
Si no se especifica un modificador de acceso para un miembro de clase, se asume que es private
por defecto.
1. ¿Qué modificador de acceso permite que un miembro sea accesible solo dentro de su clase definitoria?
2. ¿Cómo se puede hacer que un atributo de clase sea inaccesible desde fuera?
3. ¿Cuál es una buena manera de acceder a los valores de los campos privados desde fuera de la clase?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 2.04
Modificadores de Acceso Comunes
Desliza para mostrar el menú
Es posible que ya estés familiarizado con la palabra clave public
. Es un modificador de acceso que define desde dónde se puede acceder a una clase, método o campo.
De manera similar, existen términos como private
y protected
. Ambos pueden utilizarse para especificar la accesibilidad de un método o un campo.
Cuando escribes public
antes de una clase, simplemente haces que la clase sea accesible desde diferentes partes (archivos) del programa. No es necesario profundizar en ese aspecto, ya que está fuera del alcance de este capítulo.
Cuando especificas un método o un campo como public
, básicamente haces que esa propiedad de la clase sea accesible desde cualquier parte del código a través de un objeto:
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); } }
Si no deseas que un campo o método de un objeto sea accesible fuera de la clase, simplemente podemos declararlo como private
:
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); } }
Es importante señalar que los campos y métodos privados no son heredados por las clases derivadas:
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()); } }
Para hacer que un campo o método sea inaccesible desde fuera de la clase pero accesible desde las clases derivadas, se puede utilizar la palabra clave protected
:
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()); } }
En ocasiones, para poder acceder a atributos privados de una clase, se crean métodos públicos llamados getters. El método getMagnitude
es un ejemplo de getter. Esto garantiza que el campo solo sea legible y no modificable, haciendo que dicho atributo sea de solo lectura.
Si no se especifica un modificador de acceso para un miembro de clase, se asume que es private
por defecto.
1. ¿Qué modificador de acceso permite que un miembro sea accesible solo dentro de su clase definitoria?
2. ¿Cómo se puede hacer que un atributo de clase sea inaccesible desde fuera?
3. ¿Cuál es una buena manera de acceder a los valores de los campos privados desde fuera de la clase?
¡Gracias por tus comentarios!