Cómo: Definir propiedades abstractas (Guía de programación de C#)

Actualización: noviembre 2007

En el ejemplo siguiente, se muestra cómo definir propiedades abstractas. Una declaración de propiedad abstracta no proporciona una implementación de descriptores de acceso de la propiedad; por el contrario, declara que la clase acepta propiedades pero deja la implementación de los descriptores de acceso a las clases derivadas. El ejemplo siguiente muestra cómo implementar las propiedades abstractas heredadas de una clase base.

Este ejemplo consta de tres archivos, cada uno de los cuales se compila individualmente; la compilación siguiente hace referencia al ensamblado resultante:

  • abstractshape.cs: la clase Shape que contiene una propiedad Area abstracta.

  • shapes.cs: las subclases de la clase Shape.

  • shapetest.cs: un programa de prueba que muestra en pantalla las áreas de algunos objetos derivados de Shape.

Para compilar el ejemplo, utilice el comando siguiente:

csc abstractshape.cs shapes.cs shapetest.cs

De esta forma, se creará el archivo ejecutable shapetest.exe.

Ejemplo

Este archivo declara la clase Shape que contiene la propiedad 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);
    }
}
  • Los modificadores de la propiedad se colocan en la misma declaración de propiedad. Por ejemplo:

    public abstract double Area
    
  • Cuando se declara una propiedad abstracta (tal como Area en este ejemplo), simplemente se indica qué descriptores de acceso a la propiedad están disponibles, pero no se implementan. En este ejemplo, sólo se dispone de un descriptor de acceso get, de modo que la propiedad es de sólo lectura.

El siguiente código muestra tres subclases de Shape y cómo reemplazan la propiedad Area para proporcionar sus propias implementaciones.

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

El siguiente código muestra un programa de prueba que crea una serie de objetos derivados de Shape e imprime sus áreas.

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

Vea también

Tareas

Cómo: Crear y utilizar archivos DLL de C# (Guía de programación de C#)

Conceptos

Guía de programación de C#

Referencia

Clases y estructuras (Guía de programación de C#)

Clases y miembros de clase abstractos y sellados (Guía de programación de C#)

Propiedades (Guía de programación de C#)