Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Abstraktion | OOP-principer
C# Bortom Grunderna

bookAbstraktion

Abstraktion är ett grundläggande koncept inom objektorienterad programmering (OOP) som gör det möjligt att dölja komplexa implementeringsdetaljer och fokusera på väsentliga funktionaliteter. I C# uppnås abstraktion genom abstrakta klasser.

Note
Notering

OOP baserades ursprungligen på tre principer (ibland kallade "De tre pelarna inom OOP"), inklusive inkapsling, arv och polymorfism. Därför är abstraktion ett nytt tillägg och betraktas ibland inte som ett grundläggande koncept enligt vissa källor, men det är ändå ett viktigt begrepp.

En abstrakt klass är en klass som inte kan instansieras, vilket innebär att du inte kan skapa ett objekt av den klassen. En abstrakt klass kan innehålla attribut och metoder precis som vilken annan klass som helst, men den kan även innehålla abstrakta metoder som är blåputsmetoder avsedda att implementeras av underklasser.

Du kan skapa en abstrakt klass genom att lägga till nyckelordet abstract före klassdefinitionen. Till exempel, låt oss skapa en abstrakt klass som heter 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å liknande sätt kan du skapa en abstrakt metod genom att lägga till nyckelordet abstract före dess returtyp. En abstrakt metod har ingen kropp – den fungerar endast som en ritning:

index.cs

index.cs

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

Syftet med detta är att skapa en ritning för andra klasser. Detta bidrar till att förenkla koden. För att förstå detta bättre, låt oss titta på uppgiften om Polymorfism från 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 exemplet ovan är det aldrig meningen att använda klassen Shape, men du var ändå tvungen att skriva några falska implementationer av metoderna getArea och calculatePerimeter i klassen Shape. Du kan förenkla denna kod något genom att göra klassen Shape abstrakt, och dessutom kan du göra metoderna getArea och calculatePerimeter abstrakta.

Note
Notera

En metod kan vara antingen abstrakt eller virtuell, men inte båda samtidigt. Det är dock viktigt att notera att en abstrakt metod i grunden är en virtuell (överskuggbar) metod, men den saknar implementering i basklassen.

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. Vilket nyckelord används för att göra en klass abstrakt?

2. Kan en abstrakt klass instansieras?

question mark

Vilket nyckelord används för att göra en klass abstrakt?

Select the correct answer

question mark

Kan en abstrakt klass instansieras?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 8

Fråga AI

expand

Fråga AI

ChatGPT

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

bookAbstraktion

Svep för att visa menyn

Abstraktion är ett grundläggande koncept inom objektorienterad programmering (OOP) som gör det möjligt att dölja komplexa implementeringsdetaljer och fokusera på väsentliga funktionaliteter. I C# uppnås abstraktion genom abstrakta klasser.

Note
Notering

OOP baserades ursprungligen på tre principer (ibland kallade "De tre pelarna inom OOP"), inklusive inkapsling, arv och polymorfism. Därför är abstraktion ett nytt tillägg och betraktas ibland inte som ett grundläggande koncept enligt vissa källor, men det är ändå ett viktigt begrepp.

En abstrakt klass är en klass som inte kan instansieras, vilket innebär att du inte kan skapa ett objekt av den klassen. En abstrakt klass kan innehålla attribut och metoder precis som vilken annan klass som helst, men den kan även innehålla abstrakta metoder som är blåputsmetoder avsedda att implementeras av underklasser.

Du kan skapa en abstrakt klass genom att lägga till nyckelordet abstract före klassdefinitionen. Till exempel, låt oss skapa en abstrakt klass som heter 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å liknande sätt kan du skapa en abstrakt metod genom att lägga till nyckelordet abstract före dess returtyp. En abstrakt metod har ingen kropp – den fungerar endast som en ritning:

index.cs

index.cs

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

Syftet med detta är att skapa en ritning för andra klasser. Detta bidrar till att förenkla koden. För att förstå detta bättre, låt oss titta på uppgiften om Polymorfism från 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 exemplet ovan är det aldrig meningen att använda klassen Shape, men du var ändå tvungen att skriva några falska implementationer av metoderna getArea och calculatePerimeter i klassen Shape. Du kan förenkla denna kod något genom att göra klassen Shape abstrakt, och dessutom kan du göra metoderna getArea och calculatePerimeter abstrakta.

Note
Notera

En metod kan vara antingen abstrakt eller virtuell, men inte båda samtidigt. Det är dock viktigt att notera att en abstrakt metod i grunden är en virtuell (överskuggbar) metod, men den saknar implementering i basklassen.

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. Vilket nyckelord används för att göra en klass abstrakt?

2. Kan en abstrakt klass instansieras?

question mark

Vilket nyckelord används för att göra en klass abstrakt?

Select the correct answer

question mark

Kan en abstrakt klass instansieras?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 8
some-alt