Abstraktion
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.
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
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å 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
1234567891011abstract 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
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 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.
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
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. Vilket nyckelord används för att göra en klass abstrakt?
2. Kan en abstrakt klass instansieras?
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
Abstraktion
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.
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
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å 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
1234567891011abstract 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
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 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.
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
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. Vilket nyckelord används för att göra en klass abstrakt?
2. Kan en abstrakt klass instansieras?
Tack för dina kommentarer!