Comment définir des propriétés abstraites (Guide de programmation C#)
L’exemple suivant montre comment définir des propriétés abstract. Une déclaration de propriété abstraite ne fournit pas une implémentation des accesseurs de propriété ; elle déclare que la classe prend en charge des propriétés, mais laisse l’implémentation de l’accesseur aux classes dérivées. L’exemple suivant montre comment implémenter les propriétés abstraites héritées d’une classe de base.
Cet exemple se compose de trois fichiers, chacun étant compilé individuellement, et l’assembly obtenu est référencé par la compilation suivante :
abstractshape.cs : classe
Shape
qui contient une propriétéArea
abstraite.shapes.cs : sous-classes de la classe
Shape
.shapetest.cs : programme de test destiné à afficher les zones de certains objets dérivés de
Shape
.
Pour compiler l’exemple, utilisez la commande suivante :
csc abstractshape.cs shapes.cs shapetest.cs
Cette commande crée le fichier exécutable shapetest.exe.
Exemples
Ce fichier déclare la classe Shape
qui contient la propriété Area
du type double
.
// compile with: csc -target:library abstractshape.cs
public abstract class Shape
{
private string name;
public Shape(string s)
{
// calling the set accessor of the Id property.
Id = s;
}
public string Id
{
get
{
return name;
}
set
{
name = value;
}
}
// Area is a read-only property - only a get accessor is needed:
public abstract double Area
{
get;
}
public override string ToString()
{
return $"{Id} Area = {Area:F2}";
}
}
Les modificateurs sur la propriété sont placés sur la déclaration de propriété proprement dite. Par exemple :
public abstract double Area
Quand vous déclarez une propriété abstraite (telle que
Area
dans cet exemple), vous indiquez simplement quels les accesseurs de propriété sont disponibles, mais vous ne les implémentez pas. Dans cet exemple, seul un accesseur get est disponible, donc la propriété est en lecture seule.
Le code suivant présente trois sous-classes de Shape
et indique comment elles substituent la propriété Area
pour fournir leur propre implémentation.
// compile with: csc -target:library -reference:abstractshape.dll shapes.cs
public class Square : Shape
{
private int side;
public Square(int side, string id)
: base(id)
{
this.side = side;
}
public override double Area
{
get
{
// Given the side, return the area of a square:
return side * side;
}
}
}
public class Circle : Shape
{
private int radius;
public Circle(int radius, string id)
: base(id)
{
this.radius = radius;
}
public override double Area
{
get
{
// Given the radius, return the area of a circle:
return radius * radius * System.Math.PI;
}
}
}
public class Rectangle : Shape
{
private int width;
private int height;
public Rectangle(int width, int height, string id)
: base(id)
{
this.width = width;
this.height = height;
}
public override double Area
{
get
{
// Given the width and height, return the area of a rectangle:
return width * height;
}
}
}
Le code suivant montre un programme de test qui crée un certain nombre d’objets dérivés de Shape
et imprime les zones correspondantes.
// compile with: csc -reference:abstractshape.dll;shapes.dll shapetest.cs
class TestClass
{
static void Main()
{
Shape[] shapes =
{
new Square(5, "Square #1"),
new Circle(3, "Circle #1"),
new Rectangle( 4, 5, "Rectangle #1")
};
System.Console.WriteLine("Shapes Collection");
foreach (Shape s in shapes)
{
System.Console.WriteLine(s);
}
}
}
/* Output:
Shapes Collection
Square #1 Area = 25.00
Circle #1 Area = 28.27
Rectangle #1 Area = 20.00
*/