Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Abstraktion | OOP-Prinzipien
C# Jenseits der Grundlagen

bookAbstraktion

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.

Note
Hinweis

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

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 } }

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

index.cs

copy
1234567891011
abstract 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

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()); } }

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.

Note
Hinweis

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

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. Welches Schlüsselwort wird verwendet, um eine Klasse als abstrakt zu deklarieren?

2. Kann eine abstrakte Klasse instanziiert werden?

question mark

Welches Schlüsselwort wird verwendet, um eine Klasse als abstrakt zu deklarieren?

Select the correct answer

question mark

Kann eine abstrakte Klasse instanziiert werden?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 8

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Awesome!

Completion rate improved to 2.04

bookAbstraktion

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.

Note
Hinweis

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

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 } }

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

index.cs

copy
1234567891011
abstract 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

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()); } }

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.

Note
Hinweis

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

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. Welches Schlüsselwort wird verwendet, um eine Klasse als abstrakt zu deklarieren?

2. Kann eine abstrakte Klasse instanziiert werden?

question mark

Welches Schlüsselwort wird verwendet, um eine Klasse als abstrakt zu deklarieren?

Select the correct answer

question mark

Kann eine abstrakte Klasse instanziiert werden?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 8
some-alt