Overerving: bouw voort op bestaande klassen
Met overerving (inheritance) kan een klasse alle eigenschappen en methoden overnemen van een andere klasse. De basisklasse (parent) biedt het fundament; de afgeleide klasse (child) voegt toe of overschrijft.
// Basisklasse
class CADObject
{
public string Laag { get; set; } = "0";
public string Kleur { get; set; } = "ByLayer";
public virtual void Beschrijf()
{
Console.WriteLine($"CAD-object op laag '{Laag}'");
}
}
// Afgeleide klasse
class Cirkel : CADObject
{
public double Straal { get; set; }
public override void Beschrijf()
{
Console.WriteLine($"Cirkel (r={Straal}) op laag '{Laag}'");
}
}
class Lijn : CADObject
{
public double Lengte { get; set; }
public override void Beschrijf()
{
Console.WriteLine($"Lijn ({Lengte} mm) op laag '{Laag}'");
}
}
Polymorfisme: één type, veel gedragingen
Dankzij overerving kun je objecten van verschillende subklassen behandelen als de basisklasse:
List<CADObject> objecten = new List<CADObject>
{
new Cirkel { Straal = 5.0, Laag = "Muren" },
new Lijn { Lengte = 200, Laag = "Maatvoering" },
new Cirkel { Straal = 2.5, Laag = "Hulplijnen" },
};
foreach (CADObject obj in objecten)
{
obj.Beschrijf(); // roept de juiste override aan!
}
abstract: verplicht overschrijven
Een abstract methode heeft geen implementatie in de basisklasse — elke subklasse moet haar zelf invullen:
abstract class Vorm
{
public abstract double BerekenOppervlakte();
public abstract double BerekenOmtrek();
public void ToonResultaten()
{
Console.WriteLine($"Oppervlakte: {BerekenOppervlakte():F2}");
Console.WriteLine($"Omtrek: {BerekenOmtrek():F2}");
}
}
class Rechthoek : Vorm
{
public double Breedte { get; set; }
public double Hoogte { get; set; }
public override double BerekenOppervlakte() => Breedte * Hoogte;
public override double BerekenOmtrek() => 2 * (Breedte + Hoogte);
}
Interfaces: afspraken zonder implementatie
Een interface is een lijst van methode-handtekeningen. Klassen die de interface implementeren beloven die methoden te voorzien:
interface IExporteerbaar
{
void ExporteerNaarPDF(string pad);
void ExporteerNaarDXF(string pad);
}
interface IPrintbaar
{
void Print(string printer);
}
class Tekening : IExporteerbaar, IPrintbaar
{
public string Naam { get; set; } = "";
public void ExporteerNaarPDF(string pad)
=> Console.WriteLine($"{Naam} geëxporteerd naar {pad}.pdf");
public void ExporteerNaarDXF(string pad)
=> Console.WriteLine($"{Naam} geëxporteerd naar {pad}.dxf");
public void Print(string printer)
=> Console.WriteLine($"{Naam} verzonden naar {printer}");
}
Interface vs abstract klasse
| Interface | Abstract klasse | |
|---|---|---|
| Meerdere mogelijk? | Ja | Nee (één basisklasse) |
| Standaard implementatie? | Optioneel (C# 8+) | Ja |
| Gebruik voor | Afspraken / capabilities | Gedeeld gedrag |
In de volgende post leren we hoe we fouten netjes afhandelen met try/catch.
Comments
No comments yet — be the first!
Leave a comment
Sign in to skip moderation — anonymous comments are reviewed before appearing.