Gewusst wie: Definieren von abstrakten Eigenschaften (C#-Programmierhandbuch)

Im folgenden Beispiel wird die Definition abstrakter Eigenschaften erläutert. Die Deklaration einer abstrakten Eigenschaft stellt keine Implementierung der Eigenschaftenaccessoren bereit. Sie deklariert, dass die Klasse Eigenschaften unterstützt, überlässt die Implementierung der Accessoren jedoch abgeleiteten Klassen. Im folgenden Beispiel wird veranschaulicht, wie die von einer Basisklasse geerbten abstrakten Eigenschaften implementiert werden.

Dieses Beispiel besteht aus drei Dateien, die einzeln kompiliert werden. Auf die sich daraus ergebende Assembly wird in der jeweils nächsten Kompilierung verwiesen:

  • abstractshape.cs: Die Shape-Klasse, die eine abstrakte Area-Eigenschaft enthält.

  • shapes.cs: Die Unterklassen der Shape-Klasse.

  • shapetest.cs: Ein Testprogramm zum Anzeigen der Bereiche einiger von Shape abgeleiteter Objekte.

Verwenden Sie zum Kompilieren des Beispiels die folgende Befehlszeile:

csc abstractshape.cs shapes.cs shapetest.cs

Dadurch wird die ausführbare Datei shapetest.exe erstellt.

Beispiel

Durch diese Datei wird die Shape-Klasse deklariert, die die Area-Eigenschaft vom Typ double enthält.

// 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);
    }
}
  • Modifizierer für die Eigenschaft werden in die Eigenschaftendeklaration selbst eingefügt. Beispiele:

    public abstract double Area  
    
  • Wenn Sie eine abstrakte Eigenschaft (in diesem Beispiel Area) deklarieren, geben Sie lediglich an, welche Eigenschaftenaccessoren verfügbar sind, ohne sie jedoch zu implementieren. In diesem Beispiel ist nur ein get-Accessor verfügbar, weswegen die Eigenschaft schreibgeschützt ist.

Beispiel

Im folgenden Code sind drei Unterklassen von Shape enthalten, die die Area-Eigenschaft überschreiben, um ihre eigene Implementierung bereitzustellen.

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

Beispiel

Der folgende Code stellt ein Testprogramm dar, das einige von Shape abgeleitete Objekte erstellt und ihre Bereiche ausgibt.

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

Siehe auch

C#-Programmierhandbuch
Klassen und Strukturen
Abstrakte und versiegelte Klassen und Klassenmember
Eigenschaften
Gewusst wie: Erstellen und Verwenden von Assemblys über die Befehlszeile