C# Polymorfisme: Statische vs Dynamische Binding Uitgelegd
Polymorfisme betekent 'vele vormen'. In OOP: 'één interface, meerdere functies'.
Polymorfisme kan statisch (compile-time binding, vroege binding) of dynamisch (runtime binding, late binding) zijn.
Statisch Polymorfisme
C# biedt twee technieken:
- Functie-overloading
- Operator-overloading
Functie-overloading
Meerdere definities voor dezelfde functienaam in dezelfde scope. Verschillend in typen/aantal parameters. Niet alleen in retourtype.
using System;
namespace PolymorfismeApplicatie {
class PrintData {
void Print(int i) { Console.WriteLine("Print int: {0}", i); }
void Print(double f) { Console.WriteLine("Print float: {0}", f); }
void Print(string s) { Console.WriteLine("Print string: {0}", s); }
static void Main(string[] args) {
PrintData p = new PrintData();
p.Print(5);
p.Print(500.263);
p.Print("Hello C++");
Console.ReadKey();
}
}
}
Uitvoer:
Print int: 5 Print float: 500.263 Print string: Hello C++
Dynamisch Polymorfisme
C# stelt abstracte klassen toe die gedeeltelijke implementatie bieden. Afgeleide klassen voltooien de implementatie. Abstracte klassen bevatten abstracte methodes.
Regels:
- Geen instantie van abstracte klasse.
- Abstracte methode alleen in abstracte klasse.
sealedklasse kan niet geërfd worden; abstracte klasse mag nietsealedzijn.
Voorbeeld: Abstracte Klasse
using System;
namespace PolymorfismeApplicatie {
abstract class Vorm {
public abstract int Oppervlakte();
}
class Rechthoek : Vorm {
private int lengte, breedte;
public Rechthoek(int a = 0, int b = 0) { lengte = a; breedte = b; }
public override int Oppervlakte() {
Console.WriteLine("Rechthoek klasse oppervlakte:");
return breedte * lengte;
}
}
class RechthoekTester {
static void Main(string[] args) {
Rechthoek r = new Rechthoek(10, 7);
double a = r.Oppervlakte();
Console.WriteLine("Oppervlakte: {0}", a);
Console.ReadKey();
}
}
}
Uitvoer: Rechthoek klasse oppervlakte: Oppervlakte: 70
Met virtual functies kan een basisklasse een implementatie geven die afgeleide klassen kunnen overschrijven. De aanroep wordt runtime bepaald.
Voorbeeld: Virtual Functies
using System;
namespace PolymorfismeApplicatie {
class Vorm {
protected int breedte, hoogte;
public Vorm(int a = 0, int b = 0) { breedte = a; hoogte = b; }
public virtual int Oppervlakte() {
Console.WriteLine("Basisklasse oppervlakte:");
return 0;
}
}
class Rechthoek : Vorm {
public Rechthoek(int a = 0, int b = 0) : base(a, b) { }
public override int Oppervlakte() {
Console.WriteLine("Rechthoek klasse oppervlakte:");
return breedte * hoogte;
}
}
class Driehoek : Vorm {
public Driehoek(int a = 0, int b = 0) : base(a, b) { }
public override int Oppervlakte() {
Console.WriteLine("Driehoek klasse oppervlakte:");
return breedte * hoogte / 2;
}
}
class Aproeper {
public void RoepOppervlakteAan(Vorm v) {
int a = v.Oppervlakte();
Console.WriteLine("Oppervlakte: {0}", a);
}
}
class Tester {
static void Main(string[] args) {
Aproeper a = new Aproeper();
Rechthoek r = new Rechthoek(10, 7);
Driehoek d = new Driehoek(10, 5);
a.RoepOppervlakteAan(r);
a.RoepOppervlakteAan(d);
Console.ReadKey();
}
}
}
Uitvoer:
Rechthoek klasse oppervlakte: Oppervlakte: 70 Driehoek klasse oppervlakte: Oppervlakte: 25
C Taal
- C# Classes & Objects: Fundamenten voor Robuuste OOP
- C# Access Modifiers: Public, Private, Protected, Internal en Meer
- C# Static Keyword: Static Variabelen, Methodes en Classes Beheersen
- C# Abstract Classes & Methods: Een Praktische Gids
- C# Geneste Classes: Definitie, Gebruik en Inheritance
- C# Partial Classes en Methods: Een Praktische Gids
- C++ Class Templates Beheersen: Een Praktische Gids
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java ObjectOutputStream: Serialisatie, methoden en praktische voorbeelden
- Java Generics: Herbruikbare, type-veilige code bouwen
- Java-bestandsbewerkingen onder de knie krijgen met java.io – Aanmaken, lezen, schrijven en verwijderen