Comment : définir des propriétés abstraites (Guide de programmation C#)
Mise à jour : novembre 2007
L'exemple suivant explique comment définir des propriétés abstraites. 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, dont chacun est compilé individuellement et dont l'assembly produit est référencé par la compilation suivante :
abstractshape.cs: la classe Shape qui contient une propriété Area abstraite.
shapes.cs : Les sous-classes de la classe Shape.
shapetest.cs : Un programme de test pour afficher des 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.
Exemple
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 = " + string.Format("{0:F2}", Area);
}
}
Les modificateurs sur la propriété sont placés sur la déclaration de propriété proprement dite. Par exemple :
public abstract double Area
Lorsque vous déclarez une propriété abstraite (telle Area dans cet exemple), vous indiquez simplement quels sont les accesseurs de propriété 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 qui 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 présente un programme 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
*/
Voir aussi
Tâches
Comment : créer et utiliser des DLL C# (Guide de programmation C#)
Concepts
Référence
Classes et structs (Guide de programmation C#)
Classes abstract et sealed et membres de classe (Guide de programmation C#)