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), darunter Kapselung, Vererbung und Polymorphie. Daher ist Abstraktion eine neue 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 Vorlagenmethoden sind und von abgeleiteten Klassen implementiert werden müssen.
Eine abstrakte Klasse kann erstellt werden, 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 davon ist, 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 einige Scheinimplementierungen der Methoden getArea und calculatePerimeter innerhalb der Klasse Shape geschrieben werden. Dieser Code kann vereinfacht werden, indem die Klasse Shape abstrakt gemacht wird. Darüber hinaus können auch die Methoden getArea und calculatePerimeter als abstrakt deklariert werden.
Eine Methode kann entweder abstrakt oder virtuell sein, jedoch nicht beides gleichzeitig. Es ist jedoch wichtig zu beachten, dass eine abstrakte Methode im Grunde eine virtuelle (überschreibbare) Methode ist, die jedoch im Basisklasse keinen Methodenrumpf 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; } 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 abstrakt zu machen?
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
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
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), darunter Kapselung, Vererbung und Polymorphie. Daher ist Abstraktion eine neue 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 Vorlagenmethoden sind und von abgeleiteten Klassen implementiert werden müssen.
Eine abstrakte Klasse kann erstellt werden, 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 davon ist, 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 einige Scheinimplementierungen der Methoden getArea und calculatePerimeter innerhalb der Klasse Shape geschrieben werden. Dieser Code kann vereinfacht werden, indem die Klasse Shape abstrakt gemacht wird. Darüber hinaus können auch die Methoden getArea und calculatePerimeter als abstrakt deklariert werden.
Eine Methode kann entweder abstrakt oder virtuell sein, jedoch nicht beides gleichzeitig. Es ist jedoch wichtig zu beachten, dass eine abstrakte Methode im Grunde eine virtuelle (überschreibbare) Methode ist, die jedoch im Basisklasse keinen Methodenrumpf 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; } 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 abstrakt zu machen?
2. Kann eine abstrakte Klasse instanziiert werden?
Danke für Ihr Feedback!