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

bookAbstraktion

Abstraktion er et grundlæggende begreb inden for objektorienteret programmering (OOP), der gør det muligt at skjule komplekse implementeringsdetaljer og fokusere på væsentlige funktionaliteter. I C# opnås abstraktion gennem abstrakte klasser.

Note
Bemærk

OOP var oprindeligt baseret på tre principper (nogle gange omtalt som "De tre søjler i OOP"), herunder Indkapsling, Arv og Polymorfi. Derfor er Abstraktion en nyere tilføjelse og betragtes nogle gange ikke som et grundlæggende begreb ifølge visse kilder, men det er stadig et vigtigt begreb.

En abstrakt klasse er en klasse, der ikke kan instantieres, hvilket betyder, at du ikke kan oprette et objekt af den klasse. En abstrakt klasse kan indeholde attributter og metoder som enhver anden klasse, men den kan også indeholde abstrakte metoder, som er skabelonmetoder beregnet til at blive implementeret af afledte klasser.

Du kan oprette en abstrakt klasse ved at tilføje nøgleordet abstract før klassedefinitionen. For eksempel, lad os oprette en abstrakt klasse kaldet Shape:

index.cs

index.cs

copy
12345678910111213141516171819
using System; abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } } class ConsoleApp { static void Main() { Shape s = new Shape(); // Error: Cannot create an instance of an abstract class } }

På samme måde kan du oprette en abstrakt metode ved at tilføje nøgleordet abstract før dens returtype. En abstrakt metode har ingen krop – det er blot en skabelon:

index.cs

index.cs

copy
1234567891011
abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }

Formålet med dette er at skabe en skabelon for andre klasser. Dette hjælper med at forenkle koden. For at forstå dette bedre, lad os se på opgaven om Polymorfi fra Kapitel 5:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
using System; class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public virtual float getArea() { return 0.0f; } // A virtual method can only be either 'public' or 'protected' protected virtual float calculatorPerimeter() { return 0.0f; } } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } // Area of a Circle = pi . r . r public override float getArea() { return 3.14f * radius * radius; } // Perimeter (or) Circumference: 2 . pi . r protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); Console.WriteLine(r1.getArea()); Console.WriteLine(s1.getArea()); Console.WriteLine(c1.getArea()); } }

I ovenstående eksempel er det ikke meningen, at du skal bruge Shape-klassen direkte, men du var stadig nødt til at skrive nogle fiktive implementeringer af metoderne getArea og calculatePerimeter i Shape-klassen. Du kan forenkle denne kode ved at gøre Shape-klassen abstrakt, og derudover kan du også gøre metoderne getArea og calculatePerimeter abstrakte.

Note
Bemærk

En metode kan enten være abstrakt eller virtuelt, men ikke begge på samme tid. Det er dog vigtigt at bemærke, at en abstrakt metode grundlæggende er en virtuel (overskrivelig) metode, men den har ingen krop i basisklassen.

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
using System; using System.Collections.Generic; abstract class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public abstract float getArea(); protected abstract float calculatorPerimeter(); } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } public override float getArea() { return 3.14f * radius * radius; } protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); // We cannot create an instance of 'Shape' but we can use type datatype "Shape" for creating variables, arrays or lists List<Shape> shapes = new List<Shape>(); shapes.Add(r1); shapes.Add(s1); shapes.Add(c1); foreach(Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }

1. Hvilket nøgleord bruges til at gøre en klasse abstrakt?

2. Kan en abstrakt klasse instantieres?

question mark

Hvilket nøgleord bruges til at gøre en klasse abstrakt?

Select the correct answer

question mark

Kan en abstrakt klasse instantieres?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 8

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

Suggested prompts:

Can you show me an example of an abstract class with abstract methods in C#?

What is the difference between an abstract class and an interface in C#?

How do derived classes implement abstract methods?

Awesome!

Completion rate improved to 2.04

bookAbstraktion

Stryg for at vise menuen

Abstraktion er et grundlæggende begreb inden for objektorienteret programmering (OOP), der gør det muligt at skjule komplekse implementeringsdetaljer og fokusere på væsentlige funktionaliteter. I C# opnås abstraktion gennem abstrakte klasser.

Note
Bemærk

OOP var oprindeligt baseret på tre principper (nogle gange omtalt som "De tre søjler i OOP"), herunder Indkapsling, Arv og Polymorfi. Derfor er Abstraktion en nyere tilføjelse og betragtes nogle gange ikke som et grundlæggende begreb ifølge visse kilder, men det er stadig et vigtigt begreb.

En abstrakt klasse er en klasse, der ikke kan instantieres, hvilket betyder, at du ikke kan oprette et objekt af den klasse. En abstrakt klasse kan indeholde attributter og metoder som enhver anden klasse, men den kan også indeholde abstrakte metoder, som er skabelonmetoder beregnet til at blive implementeret af afledte klasser.

Du kan oprette en abstrakt klasse ved at tilføje nøgleordet abstract før klassedefinitionen. For eksempel, lad os oprette en abstrakt klasse kaldet Shape:

index.cs

index.cs

copy
12345678910111213141516171819
using System; abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } } class ConsoleApp { static void Main() { Shape s = new Shape(); // Error: Cannot create an instance of an abstract class } }

På samme måde kan du oprette en abstrakt metode ved at tilføje nøgleordet abstract før dens returtype. En abstrakt metode har ingen krop – det er blot en skabelon:

index.cs

index.cs

copy
1234567891011
abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }

Formålet med dette er at skabe en skabelon for andre klasser. Dette hjælper med at forenkle koden. For at forstå dette bedre, lad os se på opgaven om Polymorfi fra Kapitel 5:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
using System; class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public virtual float getArea() { return 0.0f; } // A virtual method can only be either 'public' or 'protected' protected virtual float calculatorPerimeter() { return 0.0f; } } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } // Area of a Circle = pi . r . r public override float getArea() { return 3.14f * radius * radius; } // Perimeter (or) Circumference: 2 . pi . r protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); Console.WriteLine(r1.getArea()); Console.WriteLine(s1.getArea()); Console.WriteLine(c1.getArea()); } }

I ovenstående eksempel er det ikke meningen, at du skal bruge Shape-klassen direkte, men du var stadig nødt til at skrive nogle fiktive implementeringer af metoderne getArea og calculatePerimeter i Shape-klassen. Du kan forenkle denne kode ved at gøre Shape-klassen abstrakt, og derudover kan du også gøre metoderne getArea og calculatePerimeter abstrakte.

Note
Bemærk

En metode kan enten være abstrakt eller virtuelt, men ikke begge på samme tid. Det er dog vigtigt at bemærke, at en abstrakt metode grundlæggende er en virtuel (overskrivelig) metode, men den har ingen krop i basisklassen.

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
using System; using System.Collections.Generic; abstract class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public abstract float getArea(); protected abstract float calculatorPerimeter(); } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } public override float getArea() { return 3.14f * radius * radius; } protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); // We cannot create an instance of 'Shape' but we can use type datatype "Shape" for creating variables, arrays or lists List<Shape> shapes = new List<Shape>(); shapes.Add(r1); shapes.Add(s1); shapes.Add(c1); foreach(Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }

1. Hvilket nøgleord bruges til at gøre en klasse abstrakt?

2. Kan en abstrakt klasse instantieres?

question mark

Hvilket nøgleord bruges til at gøre en klasse abstrakt?

Select the correct answer

question mark

Kan en abstrakt klasse instantieres?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 8
some-alt