Condividi tramite


Procedura: definire proprietà astratte (Guida per programmatori C#)

Nell'esempio seguente viene illustrato come definire proprietà astratte. La dichiarazione di una proprietà astratta non fornisce un'implementazione delle funzioni di accesso della proprietà. Viene dichiarato che la classe supporta le proprietà, ma l'implementazione delle funzioni di accesso viene demandata alle classi derivate. Nell'esempio riportato di seguito viene illustrato come implementare le proprietà astratte ereditate da una classe base.

L'esempio include tre file, ciascuno dei quali viene compilato singolarmente e il cui assembly risultante viene utilizzato come riferimento nella compilazione successiva:

  • abstractshape.cs: la classe Shape che contiene una proprietà Area astratta.

  • shapes.cs: le sottoclassi della classe Shape.

  • shapetest.cs: un programma di test per la visualizzazione delle aree di alcuni oggetti derivati da Shape.

Per compilare l'esempio, utilizzare il seguente comando:

csc abstractshape.cs shapes.cs shapetest.cs

Verrà creato il file eseguibile shapetest.exe.

Esempio

Questo file dichiara la classe Shape che contiene la proprietà Area del tipo 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);
    }
}
  • I modificatori della proprietà sono inseriti nella dichiarazione della proprietà stessa. Di seguito è riportato un esempio:

    public abstract double Area
    
  • Quando si dichiara una proprietà astratta (quale Area, in questo esempio), è sufficiente indicare le funzioni di accesso disponibili per la proprietà, senza implementarle. In questo esempio è disponibile solo una funzione di accesso get, pertanto la proprietà è in sola lettura.

Nel codice riportato di seguito sono presenti tre sottoclassi di Shape di cui viene illustrato l'override della proprietà Area per fornire la propria implementazione.

// 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;
        }
    }
}

Nel codice riportato di seguito viene illustrato un programma di test che crea una serie di oggetti derivati da Shape e ne stampa le aree.

// 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
*/

Vedere anche

Attività

Procedura: creare e utilizzare assembly dalla riga di comando (C# e Visual Basic)

Riferimenti

Classi e struct (Guida per programmatori C#)

Classi e membri delle classi astratte e sealed (Guida per programmatori C#)

Proprietà (Guida per programmatori C#)

Concetti

Guida per programmatori C#