Abstractie
Abstractie is een fundamenteel concept in objectgeoriënteerd programmeren (OOP) dat het mogelijk maakt om complexe implementatiedetails te verbergen en te focussen op essentiële functionaliteiten. In C# wordt abstractie bereikt via abstracte klassen.
OOP was oorspronkelijk gebaseerd op drie principes (soms aangeduid als "De Drie Pijlers van OOP"), waaronder Encapsulatie, Overerving en Polymorfisme. Daarom is abstractie een nieuwe toevoeging en wordt het soms niet als een fundamenteel concept beschouwd volgens sommige bronnen. Toch is het een belangrijk concept.
Een abstracte klasse is een klasse die niet geïnstantieerd kan worden, wat betekent dat je geen object van die klasse kunt maken. Een abstracte klasse kan attributen en methoden bevatten zoals elke andere klasse, maar kan ook abstracte methoden bevatten, dit zijn blauwdrukmethoden die geïmplementeerd moeten worden door afgeleide klassen.
Je kunt een abstracte klasse maken door het sleutelwoord abstract toe te voegen vóór de definitie van de klasse. Bijvoorbeeld, laten we een abstracte klasse genaamd Shape maken:
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 } }
Op vergelijkbare wijze kun je een abstracte methode aanmaken door het sleutelwoord abstract vóór het retourtype te plaatsen. Een abstracte methode heeft geen body - het is simpelweg een blauwdruk:
index.cs
1234567891011abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }
Het doel hiervan is om een blauwdruk voor andere klassen te creëren. Dit helpt bij het vereenvoudigen van de code. Om dit beter te begrijpen, bekijken we de Polymorfisme-opdracht uit Hoofdstuk 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()); } }
In het bovenstaande voorbeeld is het niet de bedoeling om de Shape-klasse direct te gebruiken, maar moest je toch enkele fictieve implementaties van de methoden getArea en calculatePerimeter in de Shape-klasse schrijven. Je kunt deze code enigszins vereenvoudigen door de Shape-klasse abstract te maken. Daarnaast kun je ook de methoden getArea en calculatePerimeter abstract maken.
Een methode kan ofwel abstract of virtual zijn, maar niet beide tegelijkertijd. Het is echter belangrijk op te merken dat een abstracte methode in wezen een virtuele (overschrijfbare) methode is, maar zonder implementatie in de basisklasse.
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. Welke keyword wordt gebruikt om een klasse abstract te maken?
2. Kan een abstracte klasse worden geïnstantieerd?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 2.04
Abstractie
Veeg om het menu te tonen
Abstractie is een fundamenteel concept in objectgeoriënteerd programmeren (OOP) dat het mogelijk maakt om complexe implementatiedetails te verbergen en te focussen op essentiële functionaliteiten. In C# wordt abstractie bereikt via abstracte klassen.
OOP was oorspronkelijk gebaseerd op drie principes (soms aangeduid als "De Drie Pijlers van OOP"), waaronder Encapsulatie, Overerving en Polymorfisme. Daarom is abstractie een nieuwe toevoeging en wordt het soms niet als een fundamenteel concept beschouwd volgens sommige bronnen. Toch is het een belangrijk concept.
Een abstracte klasse is een klasse die niet geïnstantieerd kan worden, wat betekent dat je geen object van die klasse kunt maken. Een abstracte klasse kan attributen en methoden bevatten zoals elke andere klasse, maar kan ook abstracte methoden bevatten, dit zijn blauwdrukmethoden die geïmplementeerd moeten worden door afgeleide klassen.
Je kunt een abstracte klasse maken door het sleutelwoord abstract toe te voegen vóór de definitie van de klasse. Bijvoorbeeld, laten we een abstracte klasse genaamd Shape maken:
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 } }
Op vergelijkbare wijze kun je een abstracte methode aanmaken door het sleutelwoord abstract vóór het retourtype te plaatsen. Een abstracte methode heeft geen body - het is simpelweg een blauwdruk:
index.cs
1234567891011abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }
Het doel hiervan is om een blauwdruk voor andere klassen te creëren. Dit helpt bij het vereenvoudigen van de code. Om dit beter te begrijpen, bekijken we de Polymorfisme-opdracht uit Hoofdstuk 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()); } }
In het bovenstaande voorbeeld is het niet de bedoeling om de Shape-klasse direct te gebruiken, maar moest je toch enkele fictieve implementaties van de methoden getArea en calculatePerimeter in de Shape-klasse schrijven. Je kunt deze code enigszins vereenvoudigen door de Shape-klasse abstract te maken. Daarnaast kun je ook de methoden getArea en calculatePerimeter abstract maken.
Een methode kan ofwel abstract of virtual zijn, maar niet beide tegelijkertijd. Het is echter belangrijk op te merken dat een abstracte methode in wezen een virtuele (overschrijfbare) methode is, maar zonder implementatie in de basisklasse.
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. Welke keyword wordt gebruikt om een klasse abstract te maken?
2. Kan een abstracte klasse worden geïnstantieerd?
Bedankt voor je feedback!