Zie Scherp Scherper - Hoofdstuk 11
Na dit hoofdstuk kan je:
this()requiredstatic gebruiken voor fields, methoden, properties en klassenstatic deel niet bij de niet-static delen kanEen klasse bestond tot nu uit:
Daar komen nu bij:
static en object initializer syntaxnew doet drie dingen:
Vandaar de ronde haakjes bij
new Student(): dat is de constructor-aanroep.
new Student("Jos")Waarschuwing
Net als met aannemers: soms ruimen ze zelf op, soms niet. Schrijf je zelf een constructor, dan ben je de gratis default constructor kwijt.
public, geen returntype, naam = klassenaam, geen parametersTip
Enkel een auto-property een startwaarde geven? Dan volstaat public int X { get; set; } = 2; zonder constructor.
Zo kan je new Student("Lord Oakenwood") schrijven.
Waarschuwing
Vanaf nu werkt new Student() niet meer: “Student does not contain a constructor that takes 0 arguments”. Wil je de default constructor terug? Schrijf hem dan zelf.
Stel: drie constructors die elk Naam, Adres en Saldo instellen. Splits je later Adres op in Straat + Stad, dan moet je elke constructor apart aanpassen.
Waarschuwing
Code die je op meerdere plekken herhaalt, is vragen om problemen. Eén bron van waarheid is beter.
Vermijd dubbele code door één constructor de andere te laten aanroepen:
De compiler kiest via overload resolution de juiste constructor.
Minstens genoeg om een object in een geldige staat te brengen:
Tip
Door enkel deze constructor te voorzien, dwing je af dat niemand een Breuk() zonder noemer maakt (en zo een DivideByZeroException riskeert).
Geef bij de creatie properties een beginwaarde, zonder een aparte constructor:
setOpmerking
Intern: eerst de default constructor, dan m.Temperatuur = 3.4; enzovoort.
Wil je toch verplichten dat een property wordt ingesteld bij object initializer syntax? Gebruik required:
Belangrijk
required bestaat sinds C# 11 (.NET 7+).
staticgeeft aan dat een element bij de klasse zelf hoort, niet bij een individueel object.
Gevolg: je kan het aanroepen zonder een object aan te maken, en de data wordt gedeeld over alle objecten.
static kan op fields, methoden, properties en zelfs de hele klasse.
Eén exemplaar, gedeeld door alle objecten: maak je drie Mens-objecten, dan staat teller op 3.
Waarschuwing
Gebruik static met mate: het druist vaak in tegen OOP. Het past bij zaken die bij de klasse horen (een teller), niet bij een individueel object (een geboortejaar).
Daarom kan je Math.Pow(3, 2) zonder een Math-object te maken:
Belangrijk
Een static class mag enkel static members bevatten. De compiler dwingt dat af: je kan er toch nooit een object van maken.
Een static methode kan enkel andere static leden aanspreken: ze hoort bij geen enkel object.
Tip
Daarom moet in Program.cs alles static zijn: Main is zelf static.
Alle balletjes delen dezelfde speelveldgrenzen:
Elk balletje gebruikt in Update() gewoon Balletje.Breedte, zonder de grenzen zelf te kennen.
Tip
Eén gedeelde, static generator lost dat netjes op.
Een tekst-avontuur waarin de speler van kamer naar kamer wandelt:
Room
RoomDescribe() die de kamer en de uitgangen toontPlayer
HuidigeKamer bijMoveTo(richting) om (te proberen) verplaatsenTip
Een object dat een ander object als instantievariabele bevat: de kern van grotere OOP-programma’s. Uitbreiding: geef sommige kamers een NPC met een Speak()-tip.
new)this() hergebruikt constructors; object initializer syntax en required vullen properties instatic hoort bij de klasse, niet bij een object: gedeelde data en hulpmethodenstatic deel kan enkel andere static delen aansprekenTip
Volgende halte: arrays en collecties van objecten (List, foreach, Dictionary).
Kennisclips
Dezelfde concepten uit dit hoofdstuk, maar dan in andere talen. Handig om later code in Python of JavaScript te leren lezen.
In Python heet de constructor altijd __init__ (eerste parameter self):
In JavaScript heet hij gewoon constructor:
C#, Java en C++ laten meerdere constructors toe (overloading). Python kent dat niet: één __init__, en je lost het op met default-parameterwaarden:
Zowel Student("Jos") als Student("Jos", True) werkt: één constructor die zich als meerdere gedraagt.
In Java werkt static zo goed als identiek aan C#:
In Python is een variabele rechtstreeks in de klasse (zonder self) gedeeld, en @staticmethod maakt een methode die je op de klasse aanroept:
In alle gevallen hoort dit bij de klasse, niet bij een los object.
Een handige samenvattende poster (Opgelet: gemaakt m.b.v. ChatGPT Image Gen 2).