Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Almindelige Adgangsmodifikatorer | OOP-Grundprincipper
C# Ud Over Det Grundlæggende

bookAlmindelige Adgangsmodifikatorer

Du er måske allerede bekendt med nøgleordet public. Det er en adgangsmodifikator, som definerer, hvor en bestemt klasse, metode eller et felt kan tilgås fra.

Tilsvarende findes der begreber som private og protected. Begge disse begreber kan bruges til at specificere tilgængeligheden af en metode eller et felt.

Når du skriver public foran en klasse, gør det klassen tilgængelig fra forskellige dele (filer) af programmet. Du behøver ikke at undersøge denne del nærmere, da det ligger uden for dette kapitels omfang.

Når du angiver en metode eller et felt som public, gør du grundlæggende denne egenskab ved klassen tilgængelig fra alle steder i koden gennem et objekt:

index.cs

index.cs

copy
1234567891011121314151617181920212223
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); } }

Hvis du ikke ønsker, at et felt eller en metode for et objekt skal være tilgængelig uden for klassen, kan vi blot gøre det private:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
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); } }

Det er vigtigt at bemærke, at private felter og metoder ikke nedarves af afledte klasser:

index.cs

index.cs

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
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()); } }

For at gøre et felt eller en metode utilgængelig udefra klassen, men tilgængelig fra afledte klasser, kan du bruge nøgleordet protected:

index.cs

index.cs

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
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()); } }

Nogle gange opretter vi offentlige metoder kaldet gettere for at få adgang til private attributter fra en klasse. Metoden getMagnitude er et eksempel på en getter. Dette sikrer, at feltet kun kan læses og ikke skrives til, hvilket gør attributten skrivebeskyttet.

Note
Bemærk

Hvis der ikke angives en adgangsmodifikator for et klassemedlem, antages det som standard at være private.

1. Hvilken adgangsmodifikator tillader kun adgang til et medlem inden for den definerende klasse?

2. Hvordan kan man gøre et klasseattribut utilgængeligt udefra?

3. Hvad er en god måde at få adgang til værdierne af private felter udefra klassen?

question mark

Hvilken adgangsmodifikator tillader kun adgang til et medlem inden for den definerende klasse?

Select the correct answer

question mark

Hvordan kan man gøre et klasseattribut utilgængeligt udefra?

Select the correct answer

question mark

Hvad er en god måde at få adgang til værdierne af private felter udefra klassen?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Awesome!

Completion rate improved to 2.04

bookAlmindelige Adgangsmodifikatorer

Stryg for at vise menuen

Du er måske allerede bekendt med nøgleordet public. Det er en adgangsmodifikator, som definerer, hvor en bestemt klasse, metode eller et felt kan tilgås fra.

Tilsvarende findes der begreber som private og protected. Begge disse begreber kan bruges til at specificere tilgængeligheden af en metode eller et felt.

Når du skriver public foran en klasse, gør det klassen tilgængelig fra forskellige dele (filer) af programmet. Du behøver ikke at undersøge denne del nærmere, da det ligger uden for dette kapitels omfang.

Når du angiver en metode eller et felt som public, gør du grundlæggende denne egenskab ved klassen tilgængelig fra alle steder i koden gennem et objekt:

index.cs

index.cs

copy
1234567891011121314151617181920212223
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); } }

Hvis du ikke ønsker, at et felt eller en metode for et objekt skal være tilgængelig uden for klassen, kan vi blot gøre det private:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
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); } }

Det er vigtigt at bemærke, at private felter og metoder ikke nedarves af afledte klasser:

index.cs

index.cs

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
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()); } }

For at gøre et felt eller en metode utilgængelig udefra klassen, men tilgængelig fra afledte klasser, kan du bruge nøgleordet protected:

index.cs

index.cs

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
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()); } }

Nogle gange opretter vi offentlige metoder kaldet gettere for at få adgang til private attributter fra en klasse. Metoden getMagnitude er et eksempel på en getter. Dette sikrer, at feltet kun kan læses og ikke skrives til, hvilket gør attributten skrivebeskyttet.

Note
Bemærk

Hvis der ikke angives en adgangsmodifikator for et klassemedlem, antages det som standard at være private.

1. Hvilken adgangsmodifikator tillader kun adgang til et medlem inden for den definerende klasse?

2. Hvordan kan man gøre et klasseattribut utilgængeligt udefra?

3. Hvad er en god måde at få adgang til værdierne af private felter udefra klassen?

question mark

Hvilken adgangsmodifikator tillader kun adgang til et medlem inden for den definerende klasse?

Select the correct answer

question mark

Hvordan kan man gøre et klasseattribut utilgængeligt udefra?

Select the correct answer

question mark

Hvad er en god måde at få adgang til værdierne af private felter udefra klassen?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 3
some-alt