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 }