An abstract class cannot be instantiated. It defines a template that derived classes must complete by implementing its abstract members.
public abstract class Shape
{
public string Color { get; set; } = "Black";
// Derived classes must implement these
public abstract double Area();
public abstract double Perimeter();
// Shared implementation
public void Describe() =>
Console.WriteLine($"{GetType().Name} [{Color}]: area={Area():F2}, perimeter={Perimeter():F2}");
}
public class Circle : Shape
{
public Circle(double r, string color = "Black")
{
Radius = r;
Color = color;
}
public double Radius { get; }
public override double Area() => Math.PI * Radius * Radius;
public override double Perimeter() => 2 * Math.PI * Radius;
}
public class Triangle : Shape
{
public Triangle(double a, double b, double c) { A = a; B = b; C = c; }
public double A { get; } public double B { get; } public double C { get; }
public override double Area()
{
double s = Perimeter() / 2;
return Math.Sqrt(s * (s-A) * (s-B) * (s-C)); // Heron's formula
}
public override double Perimeter() => A + B + C;
}
var shapes = new Shape[] { new Circle(5, "Red"), new Triangle(3, 4, 5) };
foreach (var s in shapes) s.Describe();