Abstraktion
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.
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
12345678910111213141516171819using 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
1234567891011abstract 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102using 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.
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100using 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?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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
Abstraktion
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.
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
12345678910111213141516171819using 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
1234567891011abstract 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102using 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.
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100using 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?
Tak for dine kommentarer!