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

Das folgende Beispiel veranschaulicht, wie Sie abstrakte Eigenschaften definieren: Eine abstrakte Eigenschaftendeklaration stellt keine Implementierung des Eigenschaftenaccessors bereit, sondern deklariert, dass die Klasse Eigenschaften unterstützt, die Accessorenimplementierung jedoch abgeleiteten Klassen überlässt. Das folgende Beispiel veranschaulicht das Implementieren von abstrakten Eigenschaften, die von einer Basisklasse geerbt wurden.

Dieses Beispiel besteht aus drei Dateien, von denen jede einzeln kompiliert wird, und auf die daraus entstehende Assembly von der nächsten Kompilierung verwiesen wird.

  • 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 den folgenden Befehl, um das Beispiel zu kompilieren:

csc abstractshape.cs shapes.cs shapetest.cs

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

Beispiele

Diese Datei deklariert die Shape-Klasse, die die Area-Eigenschaft des Typs 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 = {Area:F2}";
    }
}
  • Modifizierer der Eigenschaft sind in der Deklaration der Eigenschaft selbst platziert. Zum Beispiel:

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

Der folgende Code zeigt drei Unterklassen von Shape und wie sie 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;
        }
    }
}

Der folgende Code zeigt ein Testprogramm, das eine Reihe abgeleiteter Shape-Objekte erstellt und deren Bereiche ausdruckt.

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

Weitere Informationen