Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Abstraction | Principes de la POO
C# Au-Delà des Bases

bookAbstraction

L'abstraction est un concept fondamental de la programmation orientée objet (POO) qui permet 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 à l'aide des classes abstraites.

Note
Remarque

La POO était initialement basée sur trois principes (parfois appelés « Les trois piliers de la POO ») comprenant l'encapsulation, l'héritage et le polymorphisme. Ainsi, l'abstraction est un ajout récent et peut parfois ne pas être considérée comme un concept fondamental selon certaines sources ; néanmoins, il s'agit d'un concept important.

Une classe abstraite est une classe qui ne peut pas être instanciée, ce qui signifie que vous ne pouvez pas créer d'objet de cette classe. Une classe abstraite peut contenir des attributs et des méthodes comme toute 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 les classes dérivées.

Vous pouvez 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.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 } }

De la même manière, il est possible de créer une méthode abstraite en ajoutant le mot-clé abstract avant son type de retour. Une méthode abstraite ne possède pas de corps : il s'agit simplement d'un plan directeur.

index.cs

index.cs

copy
1234567891011
abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }

L'objectif de ceci est de créer un modèle pour d'autres classes. Cela permet de simplifier le code. Pour mieux comprendre, examinons la tâche de Polymorphisme du Chapitre 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()); } }

Dans l'exemple ci-dessus, il n'est jamais prévu d'utiliser la classe Shape, cependant il était tout de même nécessaire d'écrire des implémentations factices des méthodes getArea et calculatePerimeter à l'intérieur de la classe Shape. Ce code peut être simplifié en rendant la classe Shape abstraite ; de plus, il est également possible de rendre les méthodes getArea et calculatePerimeter abstraites.

Note
Remarque

Une méthode peut être soit abstraite soit virtuelle, mais jamais les deux à la fois. Cependant, il est important de noter qu'une méthode abstraite est essentiellement une méthode virtuelle (surchageable), mais elle ne possède pas de corps dans la classe de base.

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. Quel mot-clé est utilisé pour rendre une classe abstraite ?

2. Une classe abstraite peut-elle être instanciée ?

question mark

Quel mot-clé est utilisé pour rendre une classe abstraite ?

Select the correct answer

question mark

Une classe abstraite peut-elle être instanciée ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 5. Chapitre 8

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Awesome!

Completion rate improved to 2.04

bookAbstraction

Glissez pour afficher le menu

L'abstraction est un concept fondamental de la programmation orientée objet (POO) qui permet 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 à l'aide des classes abstraites.

Note
Remarque

La POO était initialement basée sur trois principes (parfois appelés « Les trois piliers de la POO ») comprenant l'encapsulation, l'héritage et le polymorphisme. Ainsi, l'abstraction est un ajout récent et peut parfois ne pas être considérée comme un concept fondamental selon certaines sources ; néanmoins, il s'agit d'un concept important.

Une classe abstraite est une classe qui ne peut pas être instanciée, ce qui signifie que vous ne pouvez pas créer d'objet de cette classe. Une classe abstraite peut contenir des attributs et des méthodes comme toute 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 les classes dérivées.

Vous pouvez 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.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 } }

De la même manière, il est possible de créer une méthode abstraite en ajoutant le mot-clé abstract avant son type de retour. Une méthode abstraite ne possède pas de corps : il s'agit simplement d'un plan directeur.

index.cs

index.cs

copy
1234567891011
abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }

L'objectif de ceci est de créer un modèle pour d'autres classes. Cela permet de simplifier le code. Pour mieux comprendre, examinons la tâche de Polymorphisme du Chapitre 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()); } }

Dans l'exemple ci-dessus, il n'est jamais prévu d'utiliser la classe Shape, cependant il était tout de même nécessaire d'écrire des implémentations factices des méthodes getArea et calculatePerimeter à l'intérieur de la classe Shape. Ce code peut être simplifié en rendant la classe Shape abstraite ; de plus, il est également possible de rendre les méthodes getArea et calculatePerimeter abstraites.

Note
Remarque

Une méthode peut être soit abstraite soit virtuelle, mais jamais les deux à la fois. Cependant, il est important de noter qu'une méthode abstraite est essentiellement une méthode virtuelle (surchageable), mais elle ne possède pas de corps dans la classe de base.

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. Quel mot-clé est utilisé pour rendre une classe abstraite ?

2. Une classe abstraite peut-elle être instanciée ?

question mark

Quel mot-clé est utilisé pour rendre une classe abstraite ?

Select the correct answer

question mark

Une classe abstraite peut-elle être instanciée ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 5. Chapitre 8
some-alt