Dela via


Definiera abstrakta egenskaper (C#-programmeringsguide)

I följande exempel visas hur du definierar abstrakta egenskaper. En abstrakt egenskapsdeklaration tillhandahåller inte någon implementering av egenskapsåtkomsterna – den deklarerar att klassen stöder egenskaper, men lämnar accessorimplementeringen till härledda klasser. I följande exempel visas hur du implementerar de abstrakta egenskaper som ärvts från en basklass.

Det här exemplet består av tre filer som var och en kompileras individuellt och den resulterande sammansättningen refereras till av nästa kompilering:

  • abstractshape.cs: klassen Shape som innehåller en abstrakt Area egenskap.

  • shapes.cs: Underklasserna för klassen Shape.

  • shapetest.cs: Ett testprogram för att visa områdena för vissa Shape-härledda objekt.

Kompilera exemplet med följande kommando:

csc abstractshape.cs shapes.cs shapetest.cs

Då skapas den körbara filen shapetest.exe.

Exempel

Den här filen deklarerar den Shape-klass som innehåller egenskapen Area av typen double.

// compile with: csc -target:library abstractshape.cs
public abstract class Shape
{
    public Shape(string s)
    {
        // calling the set accessor of the Id property.
        Id = s;
    }

    public string Id { get; set; }

    // 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}";
    }
}
  • Modifikatorer på egenskapen placeras i själva egenskapsdeklarationen. Till exempel:

    public abstract double Area  
    
  • När du deklarerar en abstrakt egenskap (till exempel Area i det här exemplet) anger du bara vilka egenskapsåtkomster som är tillgängliga, men implementerar dem inte. I det här exemplet finns bara en hämta-accessor tillgänglig, så egenskapen är skrivskyddad.

Följande kod visar tre underklasser av Shape och hur de åsidosätter egenskapen Area för att tillhandahålla sin egen implementering.

// 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)
    {
        _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)
    {
        _radius = radius;
    }

    public override double Area
    {
        get
        {
            // Given the radius, return the area of a circle:
            return _radius * _radius * Math.PI;
        }
    }
}

public class Rectangle : Shape
{
    private int _width;
    private int _height;

    public Rectangle(int width, int height, string id)
        : base(id)
    {
        _width = width;
        _height = height;
    }

    public override double Area
    {
        get
        {
            // Given the width and height, return the area of a rectangle:
            return _width * _height;
        }
    }
}

Följande kod visar ett testprogram som skapar ett antal Shape-härledda objekt och skriver ut sina områden.

// 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")
        ];

        Console.WriteLine("Shapes Collection");
        foreach (Shape s in shapes)
        {
            Console.WriteLine(s);
        }
    }
}
/* Output:
    Shapes Collection
    Square #1 Area = 25.00
    Circle #1 Area = 28.27
    Rectangle #1 Area = 20.00
*/

Se även