Contenu du cours
C# au-delà des Bases
C# au-delà des Bases
Abstraction
L'abstraction est un concept fondamental de la programmation orientée objet (POO) qui permet aux développeurs de masquer les détails d'implémentation complexes et de se concentrer sur les fonctionnalités essentielles. En C#, l'abstraction est réalisée grâce aux classes abstraites.
Une classe abstraite est une classe qui ne peut pas être instanciée, ce qui signifie que nous ne pouvons pas créer un objet de cette classe. Une classe abstraite peut contenir des attributs et des méthodes comme n'importe quelle autre classe, mais elle peut également contenir des méthodes abstraites qui sont des méthodes modèles destinées à être implémentées par des classes dérivées.
Nous pouvons créer une classe abstraite en ajoutant le mot-clé abstract
avant la définition de la classe. Par exemple, créons une classe abstraite appelée Shape
:
index
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 } }
De même, nous pouvons créer une méthode abstraite en ajoutant le mot-clé abstract
avant son type de retour. Une méthode abstraite n'a pas de corps - c'est simplement un modèle :
index
abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }
Le but de ceci est de créer un plan pour d'autres classes. Cela aide à simplifier le code. Pour mieux comprendre cela, regardons la tâche de polymorphisme du chapitre 5 :
index
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()); } }
Dans l'exemple ci-dessus, nous n'avons jamais l'intention d'utiliser la classe Shape
, cependant nous avons dû écrire quelques implémentations fictives des méthodes getArea
et calculatePerimeter
à l'intérieur de la classe Shape
. Nous pouvons quelque peu simplifier ce code en rendant la classe Shape
abstraite, en plus de cela, nous pouvons également rendre les méthodes getArea
et calculatePerimeter
abstraites.
index
using System; 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. Quel mot-clé est utilisé pour rendre une classe abstraite ?
2. Une classe abstraite peut-elle être instanciée ?
Merci pour vos commentaires !