Gameprogrammeren: Abstracte klassen Arjan Egges Paul Bergervoet Wouter van Toll
Terugblik: Overerving class Painter : Game Painter is een subklasse van Game Game is de superklasse van Painter Elk Painter-object is tevens een Game-object Een Painter-object is een bijzonder geval van een Game-object
Terugblik: Hiërarchie-ontwerp class Voertuig : Vervoermiddel class Boot : Vervoermiddel Voertuig Vervoer- middel “is een” Boot
Terugblik: Virtual - Override A a = new B (); a . m( ); dit mag, als class B : A deze methode komt uit klasse: B als m virtual in A en override in B A anders
Abstracte klasse Nieuw concept: abstract class Klasse waarvan je mag overerven, maar die je nooit mag/wilt instantiëren ThreeColorGameObject is een goede kandidaat Game bevat altijd PaintCan, Ball, etc. en nooit een “gewone” ThreeColorGameObject TetrisBlock ook Game bevat altijd een specifieke soorten blokken Verdere overerving-concepten blijven hetzelfde!
Geeft aan dat je nooit een gewone Animal mag maken Voorbeeld abstract class Animal { // code shared by all animals } class Cat : Animal { // code that is specific for cats Geeft aan dat je nooit een gewone Animal mag maken Wat mag er wel/niet? Cat a = new Cat(); // mag gewoon Animal b = new Cat(); // mag ook nog steeds Animal c = new Animal(); // mag niet, want Animal is abstract! List<Animal> zoo = new List<Animal>(); // OK (lijst is nog leeg) Animal[] zoo2 = new Animal[100]; // OK (je hebt nog geen Animals // gemaakt, alleen ruimte gereserveerd)
Abstracte methoden Zo’n klasse mag abstracte methoden hebben Die moet elke niet-abstracte subklasse dan invullen abstract class Animal { public abstract void SayHello(); } class Cat : Animal { public override void SayHello() { Console.WriteLine("Meow!"); Geen implementatie in Animal zelf override, net als bij gewone inheritance Zonder implementatie vindt de compiler een Cat geen geldige Animal
Abstracte properties Ook properties mogen abstract zijn Dus dit is een mooiere versie van het voorbeeld: abstract class Animal { public void SayHello() { Console.WriteLine(Hello); } protected abstract string Hello { get; } class Cat : Animal { protected override string Hello { get { return "Meow!"; } Elke Animal schrijft sowieso iets naar de console (dus deze methode is niet meer abstract) Geen implementatie in Animal zelf Invulling van de property
Even opletten Zodra je één methode abstract maakt, moet de klasse zelf ook abstract zijn Een abstracte klasse mag ook niet-abstracte onderdelen hebben (zie vorige slide) Een abstracte methode/property mag zelf geen body hebben Dan kun je ‘m beter virtual maken Een implementatie van een abstracte methode mag zelf best weer virtual zijn
Waarom? Extra structuur in je programma aanbrengen Je belooft de compiler dat je bepaalde klassen nooit zult maken... ...maar je mag wel het gedrag ervan gebruiken! Ontstaat vaak “vanzelf” zodra je gemeen-schappelijke code in een superklasse plaatst Kleine ingreep Voeg ergens abstract toe en je compiler helpt mee