Vanliga Åtkomstmodifierare
Du kanske redan är bekant med nyckelordet public
. Det är en åtkomstmodifierare som definierar var en viss klass, metod eller ett fält kan nås ifrån.
På liknande sätt finns det termer som private
och protected
. Båda dessa termer kan användas för att specificera åtkomsten för en metod eller ett fält.
När du skriver public
före en klass gör det helt enkelt klassen tillgänglig från olika delar (filer) av programmet. Du behöver inte fördjupa dig i den aspekten eftersom det ligger utanför detta kapitels omfattning.
När du specificerar en metod eller ett fält som public
gör du i princip den egenskapen hos klassen tillgänglig från var som helst i koden via ett objekt:
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); } }
Om du inte vill att ett fält eller en metod i ett objekt ska vara tillgänglig utanför klassen kan vi helt enkelt göra det 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); } }
Det är viktigt att notera att privata fält och metoder inte ärvs av underklasser:
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()); } }
För att göra ett fält eller en metod otillgänglig utanför klassen men tillgänglig för underklasser, kan du använda nyckelordet 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()); } }
Ibland, för att kunna komma åt privata attribut från en klass, skapar vi publika metoder som kallas getters. Metoden getMagnitude
är ett exempel på en getter. Detta säkerställer att fältet endast är läsbart och inte skrivbart, vilket gör attributet skrivskyddat.
Om ingen åtkomstmodifierare anges för en klassmedlem antas den vara private
som standard.
1. Vilken åtkomstmodifierare tillåter att en medlem endast är tillgänglig inom sin definierande klass?
2. Hur kan man göra ett klassattribut otillgängligt utifrån?
3. Vad är ett bra sätt att komma åt värdena för privata fält utanför klassen?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 2.04
Vanliga Åtkomstmodifierare
Svep för att visa menyn
Du kanske redan är bekant med nyckelordet public
. Det är en åtkomstmodifierare som definierar var en viss klass, metod eller ett fält kan nås ifrån.
På liknande sätt finns det termer som private
och protected
. Båda dessa termer kan användas för att specificera åtkomsten för en metod eller ett fält.
När du skriver public
före en klass gör det helt enkelt klassen tillgänglig från olika delar (filer) av programmet. Du behöver inte fördjupa dig i den aspekten eftersom det ligger utanför detta kapitels omfattning.
När du specificerar en metod eller ett fält som public
gör du i princip den egenskapen hos klassen tillgänglig från var som helst i koden via ett objekt:
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); } }
Om du inte vill att ett fält eller en metod i ett objekt ska vara tillgänglig utanför klassen kan vi helt enkelt göra det 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); } }
Det är viktigt att notera att privata fält och metoder inte ärvs av underklasser:
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()); } }
För att göra ett fält eller en metod otillgänglig utanför klassen men tillgänglig för underklasser, kan du använda nyckelordet 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()); } }
Ibland, för att kunna komma åt privata attribut från en klass, skapar vi publika metoder som kallas getters. Metoden getMagnitude
är ett exempel på en getter. Detta säkerställer att fältet endast är läsbart och inte skrivbart, vilket gör attributet skrivskyddat.
Om ingen åtkomstmodifierare anges för en klassmedlem antas den vara private
som standard.
1. Vilken åtkomstmodifierare tillåter att en medlem endast är tillgänglig inom sin definierande klass?
2. Hur kan man göra ett klassattribut otillgängligt utifrån?
3. Vad är ett bra sätt att komma åt värdena för privata fält utanför klassen?
Tack för dina kommentarer!