C#C# · Lesson 6 of 9

Classes & OOP

C# is a thoroughly object-oriented language. Classes, inheritance, interfaces, abstract classes — it's all here, and it's well-designed.

C#
// Abstract base class
abstract class Animal {
    public string Name { get; init; }  // init: set only at construction

    protected Animal(string name) { Name = name; }

    public abstract string Speak();  // must be overridden

    public virtual string Describe() =>  // can be overridden
        $"{Name} says '{Speak()}'";
}

// Interface
interface ITrainable {
    void Train(string trick);
    IEnumerable<string> GetTricks();
}

// Concrete class
class Dog : Animal, ITrainable {
    private readonly List<string> tricks = new();

    public Dog(string name) : base(name) {}

    public override string Speak() => "Woof!";

    public void Train(string trick) => tricks.Add(trick);
    public IEnumerable<string> GetTricks() => tricks;

    // Override and extend
    public override string Describe() =>
        base.Describe() + $" (knows {tricks.Count} tricks)";
}

// Record — immutable data class (C# 9+)
record Point(double X, double Y) {
    public double Distance => Math.Sqrt(X * X + Y * Y);
}

// Usage
Dog dog = new("Rex");
dog.Train("sit");
dog.Train("shake");
Console.WriteLine(dog.Describe());

// Polymorphism
Animal animal = dog;  // Dog is an Animal
Console.WriteLine(animal.Speak());  // Woof!

// Record usage
var p = new Point(3, 4);
Console.WriteLine(p.Distance);     // 5

// Records are immutable — create modified copies with 'with'
var p2 = p with { X = 0 };
Console.WriteLine(p2);  // Point { X = 0, Y = 4 }