Software Development fundamentals Casting & polymorphism
inhoudsopgave Wat is polymorphism? Wat is casting? Hoe werkt het? Wanneer kan je casten? Nog een voorbeeld Casting checking operators (is en as)
Polymorphism Polymorphism = polymorfisme = veelvormigheid Lijkt op het principe dat iets meerdere dingen kan zijn. Bijvoorbeeld een persoon kan zijn: Mens, Leraar, Student, Kind, Ouder, Partner Maar het is allemaal dezelfde persoon (hetzelfde object) die in elke situatie anders wordt benaderd. Op deze manier kan een object ook in code worden aangesproken als verschillende classes, zolang deze classes maar compatible zijn met het object. Soms moeten we dit een handje helpen, dat heet ‘explicit casting’.
Wat is casting? Casting in film & TV: Een acteur toewijzen aan een rol Je kunt vaak een object naar een ander type casten. Soms gaat dit automatisch, soms moet je het ‘dwingen’, met haakjes (). Dit was casting: Button b = (Button)sender; Of: Student s = (Student)somePerson; Wanneer kan je casten? Je kunt altijd casten van een child class naar een parent class Dan zijn er geen haakjes nodig. Je kunt casten van een parent class naar een child class, als je zeker weet dat het object ook echt van dat type is. Dat forceer je met de haakjes: (Classnaam). Is dit belangrijk? Ja! Casting in film & TV: Een acteur toewijzen aan een rol
Hoe werkt casting? Stel dat Student overerft van Persoon ( class Student : Persoon { …. } ). We maken een object: Student tom = new Student(); We plaatsen het object in een List<Persoon> personenLijst.add(tom); // dit kan, omdat leerling erft van persoon. Tom is nu een Persoon geworden, dit werkt niet: Student test1 = personenlijst[0]; // compiler error We kunnen hem gelukkig met haakjes weer casten als Leerling: Student test = (Student)personenlijst[0]; // geen error
Nogmaals: Wanneer kan het? Je kunt altijd casten naar een base class/superclass zonder haakjes: Lifeform a = eenAmoebe; Je kunt expliciet (met haakjes) casten naar elke class of interface, maar je krijgt een runtime error (InvalidCastException) als het object niet echt van dat type is! Cat mijnKat = new Cat(); animalList.Add(mijnKat); Dog test = (Dog)animalList[0] // error
Voorbeeld Check de classes rechts Cat poekie = new Cat(); Animal beest = poekie; Ik weet de kat nu in beest zit, maar beest.Meow() werkt niet. Stel dat ik poekie kwijt ben, hoe kan ik beest laten miauwen? Oplossing: beest casten naar Cat Cat someCat = (Cat)beest; someCat.Meow(); // poekie zegt miauw, of korter: ((Cat)beest).Meow(); Dat een object kan wisselen van type, noemen we: polymorphism (polymorfisme: veelvormigheid) class Animal {….} class Cat : Animal { public void Meow() {….} }
Casting operators Soms weet je niet zeker of je iets kunt casten. Dit kan je oplossen met is of as. Manier 1, de is operator: if(beest is Cat) { // beest is een Cat, dus ik mag beest casten naar Cat } Manier 2, de as operator: Cat eenKat = beest as Cat if(eenKat != null) // eenKat is een Cat, nu kan ik ‘m gebruiken
Opdracht In de opdracht ‘Filerijden’ gaan we casting gebruiken. Deze keer met een stuk minder uitleg dan in de OOP leven opdracht. Succes!
Einde Zijn er vragen?