Abstraktion
Abstraktion ist ein grundlegendes Konzept in der objektorientierten Programmierung (OOP), das es ermöglicht, komplexe Implementierungsdetails zu verbergen und sich auf wesentliche Funktionalitäten zu konzentrieren. In C# wird Abstraktion durch abstrakte Klassen erreicht.
OOP basierte ursprünglich auf drei Prinzipien (manchmal als "Die drei Säulen der OOP" bezeichnet): Kapselung, Vererbung und Polymorphie. Daher ist Abstraktion eine neuere Ergänzung und wird laut einigen Quellen nicht immer als grundlegendes Konzept betrachtet. Dennoch ist sie ein wichtiges Konzept.
Eine abstrakte Klasse ist eine Klasse, die nicht instanziiert werden kann, was bedeutet, dass kein Objekt dieser Klasse erstellt werden kann. Eine abstrakte Klasse kann wie jede andere Klasse Attribute und Methoden enthalten, sie kann jedoch auch abstrakte Methoden enthalten, die als Blueprint-Methoden von abgeleiteten Klassen implementiert werden müssen.
Eine abstrakte Klasse wird erstellt, indem das Schlüsselwort abstract
vor die Klassendefinition gesetzt wird. Zum Beispiel erstellen wir eine abstrakte Klasse namens 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 } }
Ebenso kann eine abstrakte Methode erstellt werden, indem das Schlüsselwort abstract
vor dem Rückgabewert platziert wird. Eine abstrakte Methode besitzt keinen Methodenrumpf – sie dient lediglich als Vorlage:
index.cs
1234567891011abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }
Der Zweck hiervon ist es, eine Blaupause für andere Klassen zu erstellen. Dies trägt zur Vereinfachung des Codes bei. Um dies besser zu verstehen, betrachten wir die Aufgabe zur Polymorphie aus 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()); } }
Im obigen Beispiel ist es nicht vorgesehen, die Klasse Shape
direkt zu verwenden, dennoch mussten Sie einige Scheinimplementierungen der Methoden getArea
und calculatePerimeter
innerhalb der Klasse Shape
schreiben. Sie können diesen Code vereinfachen, indem Sie die Klasse Shape
abstrakt machen; darüber hinaus können Sie auch die Methoden getArea
und calculatePerimeter
als abstrakt deklarieren.
Eine Methode kann entweder abstrakt oder virtuell sein, aber nicht beides gleichzeitig. Es ist jedoch wichtig zu beachten, dass eine abstrakte Methode im Grunde eine virtuelle (überschreibbare) Methode ist, die jedoch keinen Rumpf in der Basisklasse besitzt.
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. Welches Schlüsselwort wird verwendet, um eine Klasse als abstrakt zu deklarieren?
2. Kann eine abstrakte Klasse instanziiert werden?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 2.04
Abstraktion
Swipe um das Menü anzuzeigen
Abstraktion ist ein grundlegendes Konzept in der objektorientierten Programmierung (OOP), das es ermöglicht, komplexe Implementierungsdetails zu verbergen und sich auf wesentliche Funktionalitäten zu konzentrieren. In C# wird Abstraktion durch abstrakte Klassen erreicht.
OOP basierte ursprünglich auf drei Prinzipien (manchmal als "Die drei Säulen der OOP" bezeichnet): Kapselung, Vererbung und Polymorphie. Daher ist Abstraktion eine neuere Ergänzung und wird laut einigen Quellen nicht immer als grundlegendes Konzept betrachtet. Dennoch ist sie ein wichtiges Konzept.
Eine abstrakte Klasse ist eine Klasse, die nicht instanziiert werden kann, was bedeutet, dass kein Objekt dieser Klasse erstellt werden kann. Eine abstrakte Klasse kann wie jede andere Klasse Attribute und Methoden enthalten, sie kann jedoch auch abstrakte Methoden enthalten, die als Blueprint-Methoden von abgeleiteten Klassen implementiert werden müssen.
Eine abstrakte Klasse wird erstellt, indem das Schlüsselwort abstract
vor die Klassendefinition gesetzt wird. Zum Beispiel erstellen wir eine abstrakte Klasse namens 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 } }
Ebenso kann eine abstrakte Methode erstellt werden, indem das Schlüsselwort abstract
vor dem Rückgabewert platziert wird. Eine abstrakte Methode besitzt keinen Methodenrumpf – sie dient lediglich als Vorlage:
index.cs
1234567891011abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }
Der Zweck hiervon ist es, eine Blaupause für andere Klassen zu erstellen. Dies trägt zur Vereinfachung des Codes bei. Um dies besser zu verstehen, betrachten wir die Aufgabe zur Polymorphie aus 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()); } }
Im obigen Beispiel ist es nicht vorgesehen, die Klasse Shape
direkt zu verwenden, dennoch mussten Sie einige Scheinimplementierungen der Methoden getArea
und calculatePerimeter
innerhalb der Klasse Shape
schreiben. Sie können diesen Code vereinfachen, indem Sie die Klasse Shape
abstrakt machen; darüber hinaus können Sie auch die Methoden getArea
und calculatePerimeter
als abstrakt deklarieren.
Eine Methode kann entweder abstrakt oder virtuell sein, aber nicht beides gleichzeitig. Es ist jedoch wichtig zu beachten, dass eine abstrakte Methode im Grunde eine virtuelle (überschreibbare) Methode ist, die jedoch keinen Rumpf in der Basisklasse besitzt.
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. Welches Schlüsselwort wird verwendet, um eine Klasse als abstrakt zu deklarieren?
2. Kann eine abstrakte Klasse instanziiert werden?
Danke für Ihr Feedback!