C# Exception Handling
C# File I/O
C# Delegates and Events
C# Generics
C# Async Programming
C# Abstract Classes

C# Abstract Classes

An abstract class cannot be instantiated. It defines a template that derived classes must complete by implementing its abstract members.

1 - Defining

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}");
}

2 - Implementing

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();

Note: Use an abstract class when derived classes share common state or behaviour. Use an interface when you only want to enforce a contract across unrelated types — a class can implement many interfaces but extend only one abstract class.

-Tip-