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 abstraktArea
egenskap.shapes.cs: Klassens
Shape
underklasser.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 klassen Shape
som innehåller Area
egenskapen för typen 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 = {Area:F2}";
}
}
Modifierare 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 är endast en get-accessor tillgänglig, så egenskapen är skrivskyddad.
Följande kod visar tre underklasser av Shape
och hur de åsidosätter Area
egenskapen 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)
{
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;
}
}
}
Följande kod visar ett testprogram som skapar ett antal Shape
-härledda objekt och skriver ut deras 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")
};
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
*/