Como definir propriedades abstratas (Guia de Programação em C#)
O exemplo a seguir mostra como definir propriedades abstratas . Uma declaração de propriedade abstrata não fornece uma implementação dos acessadores de propriedade -- ela declara que a classe suporta propriedades, mas deixa a implementação do acessador para classes derivadas. O exemplo a seguir demonstra como implementar as propriedades abstratas herdadas de uma classe base.
Este exemplo consiste em três arquivos, cada um dos quais é compilado individualmente e seu assembly resultante é referenciado pela próxima compilação:
abstractshape.cs: a
Shape
classe que contém uma propriedade abstrataArea
.shapes.cs: As subclasses da
Shape
classe.shapetest.cs: Um programa de teste para exibir as áreas de alguns
Shape
objetos derivados.
Para compilar o exemplo, use o seguinte comando:
csc abstractshape.cs shapes.cs shapetest.cs
Isso criará o arquivo executável shapetest.exe.
Exemplos
Este arquivo declara a Shape
classe que contém a Area
propriedade do 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 = {Area:F2}";
}
}
Os modificadores na propriedade são colocados na própria declaração de propriedade. Por exemplo:
public abstract double Area
Ao declarar uma propriedade abstrata (como
Area
neste exemplo), você simplesmente indica quais acessadores de propriedade estão disponíveis, mas não os implementa. Neste exemplo, apenas um acessador get está disponível, portanto, a propriedade é somente leitura.
O código a seguir mostra três subclasses de Shape
e como eles substituem a Area
propriedade para fornecer sua própria implementação.
// 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;
}
}
}
O código a seguir mostra um programa de Shape
teste que cria vários objetos derivados e imprime suas á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
*/