Je kent al methoden uit Hoofdstuk 7: stukken code met een naam die je kan hergebruiken. Het verschil in OOP is dat methoden bij een object horen. Ze hebben toegang tot de eigenschappen van dat specifieke object.
Zo’n methode heet een instance-methode — ze is gekoppeld aan een concreet object (een instantie van de klasse).
sequenceDiagram
participant Main
participant h as hond (object)
Main->>h: h.Roep()
Note over h: gebruikt eigen eigenschap Naam
h-->>Main: print "Woef! Ik ben Rex."
Een methode schrijf je in de klasse, naast de properties en constructor:
public class Hond
{
public string Naam { get; set; }
public string Ras { get; set; }
public Hond(string naam, string ras)
{
Naam = naam;
Ras = ras;
}
// Methode zonder return-waarde
public void Roep()
{
Console.WriteLine($"Woef! Ik ben {Naam}.");
}
// Methode met return-waarde
public string StelVoor()
{
return $"Ik ben {Naam}, een {Ras}.";
}
}
Instance-methode vs static methode
In Hoofdstuk 7 schreef je
public static void Methode()in deProgram-klasse.
Een instance-methode in een klasse heeft geenstatic:
public void Roep()— hoort bij een specifiek object en heeft toegang tot zijn eigenschappen.
Je roept een methode aan via de punt-notatie op het object:
Hond h = new Hond("Rex", "Labrador");
h.Roep(); // print: Woef! Ik ben Rex.
string info = h.StelVoor();
Console.WriteLine(info); // print: Ik ben Rex, een Labrador.
Elk object heeft zijn eigen methodegedrag op basis van zijn eigen eigenschappen:
Hond h1 = new Hond("Rex", "Labrador");
Hond h2 = new Hond("Fifi", "Poedel");
Console.WriteLine(h1.StelVoor()); // Ik ben Rex, een Labrador.
Console.WriteLine(h2.StelVoor()); // Ik ben Fifi, een Poedel.
flowchart LR
subgraph h1["hond h1 (Rex)"]
S1["StelVoor()"]
end
subgraph h2["hond h2 (Fifi)"]
S2["StelVoor()"]
end
Main["Main"]
Main -->|"h1.StelVoor()"| S1
S1 -->|"Ik ben Rex, een Labrador."| Main
Main -->|"h2.StelVoor()"| S2
S2 -->|"Ik ben Fifi, een Poedel."| Main
Methoden kunnen ook eigenschappen van het object aanpassen. Dit is de kern van OOP: het object beheert zijn eigen toestand.
public class Teller
{
public int Waarde { get; private set; }
public Teller()
{
Waarde = 0;
}
public void VerhoogMetEen()
{
Waarde++;
}
public void Reset()
{
Waarde = 0;
}
}
sequenceDiagram
participant Main
participant t as teller (object)
Main->>t: new Teller() → Waarde = 0
Main->>t: t.VerhoogMetEen()
Note over t: Waarde = 1
Main->>t: t.VerhoogMetEen()
Note over t: Waarde = 2
Main->>t: t.Reset()
Note over t: Waarde = 0
t-->>Main: t.Waarde = 0
Gebruik:
Teller t = new Teller();
Console.WriteLine(t.Waarde); // 0
t.VerhoogMetEen();
t.VerhoogMetEen();
Console.WriteLine(t.Waarde); // 2
t.Reset();
Console.WriteLine(t.Waarde); // 0
Methoden kunnen ook parameters ontvangen, net als gewone methoden:
public class Auto
{
public string Merk { get; set; }
public int AantalKm { get; private set; }
public Auto(string merk)
{
Merk = merk;
AantalKm = 0;
}
public void Rij(int km) // parameter: hoeveel km rijden
{
AantalKm += km;
}
public void ToonInfo()
{
Console.WriteLine($"{Merk}: {AantalKm} km");
}
}
Gebruik:
Auto a = new Auto("Toyota");
a.Rij(100);
a.Rij(50);
a.ToonInfo(); // Toyota: 150 km
flowchart TD
M["Methode"] --> V["void\n(geeft niets terug)"]
M --> R["return\n(geeft iets terug)"]
V --> V1["void zonder params\npublic void Roep()"]
V --> V2["void met params\npublic void Rij(int km)"]
R --> R1["return zonder params\npublic string StelVoor()"]
R --> R2["return met params\npublic int Kwadraat(int n)"]
| Soort | Voorbeeld | Beschrijving |
|---|---|---|
void zonder params |
public void Roep() |
Doet iets, geeft niets terug |
void met params |
public void Rij(int km) |
Ontvangt data, geeft niets terug |
| Return zonder params | public string StelVoor() |
Berekent iets op basis van eigen data |
| Return met params | public int Kwadraat(int n) |
Ontvangt data, berekent, geeft terug |
using System;
namespace H9c
{
public class BankRekening
{
public string Naam { get; set; }
public int Saldo { get; private set; }
public BankRekening(string naam, int beginSaldo)
{
Naam = naam;
Saldo = beginSaldo;
}
public void Storten(int bedrag)
{
Saldo += bedrag;
}
public bool Afhalen(int bedrag)
{
if (bedrag <= Saldo)
{
Saldo -= bedrag;
return true;
}
return false;
}
public void ToonSaldo()
{
Console.WriteLine($"{Naam}: €{Saldo}");
}
}
public class Program
{
public static void Main(string[] args)
{
BankRekening r = new BankRekening("Emma", 100);
r.ToonSaldo(); // Emma: €100
r.Storten(50);
r.ToonSaldo(); // Emma: €150
bool gelukt = r.Afhalen(200);
Console.WriteLine(gelukt ? "Gelukt" : "Onvoldoende saldo"); // Onvoldoende saldo
r.ToonSaldo(); // Emma: €150
}
}
}
Uitvoer:
Emma: €100
Emma: €150
Onvoldoende saldo
Emma: €150
classDiagram
class BankRekening {
+string Naam
+int Saldo
+BankRekening(naam, beginSaldo)
+Storten(bedrag)
+Afhalen(bedrag) bool
+ToonSaldo()
}
note for BankRekening "Eigenschappen slaan data op\nConstructor initialiseert het object\nMethoden bepalen het gedrag"
Een klasse bestaat altijd uit drie lagen:
Naam, Saldo)Storten, Afhalen, ToonSaldo)Onthoud
- Instance-methoden horen bij een object en hebben toegang tot zijn eigenschappen
- Ze hebben geen
static— dat is het verschil met methoden uit Hoofdstuk 7- Je roept ze aan met punt-notatie:
object.Methode()- Elk object voert methoden uit op basis van zijn eigen eigenschappen
- Methoden kunnen de toestand van het object lezen én wijzigen
- Een methode zonder return-waarde heeft als type
void
Veelgemaakte fout: static vergeten verwijderen
public static void Roep() // ❌ FOUT: static = niet gekoppeld aan object { Console.WriteLine(Naam); // fout: Naam bestaat niet in static context } public void Roep() // ✅ GOED: instance-methode { Console.WriteLine(Naam); // correct: toegang tot eigenschap van dit object }