ActionScript ondersteunt ook polyformisme, zij het in een eenvoudiger vorm dan in programmeertalen als Java bvb.
Dit voorbeeld maak ik in FlashDevelop 3 beta 6.
Wat is polyformisme?
Polyformisme is één van de belangrijkste pijlers van OO programmeren. Het is een toepassing van overerving, waarbij dezelfde methode in de superklasse en de subklassen, een andere implementatie krijgen.
Overerving
Ik maak twee testklassen.
class Class1 {
public function talk():Void {
trace(“Hello world 1″) ;
}
}class Class2 extends Class1 {
public function count():Void {
trace(“2″)
}
}
Class2 overerft Class1 en voegt een count() functie toe.
De Application klasse zal Class1 en Class2 implementeren. Let op de static functie ‘main() ‘ (! case-sensitive). Default zal FlashDevelop deze functie gebruiken als startpunt voor de swf. Je hebt dan geen Flash IDE nodig.
class Application {
public static function main() {
var c1_1:Class1 = new Class1()
c1_1.talk() ;var c2_2:Class2 = new Class2()
c2_2.talk() ;
c2_2.count() ;
}
}
We testen de movie en krijgen de volgende output:
Hello world 1
Hello world 1
2
Class2 gebruikt de functie talk() die geïmplementeerd is in Class1. Als je met overerving werkt, moet je dus niet alleen de functies kennen van de klasse waarin je werkt, maar ook van al de superklassen. Een goede IDE als FlashDevelop zal je snel naar deze functies leiden (via F4).
Een functie overschrijven
Je kan nu in Class2 de functie ‘talk()’ van de superklasse, overschrijven en op een andere manier implementeren.
class Class2 extends Class1 {
public function count():Void {
trace(“2″)
}
public function talk():Void {
trace(“Hello world 2″) ;
}
}
We testen de movie. De output is nu:
Hello world 1
Hello world 2
2
Polyformisme
Afhankelijk van de implementatie, kan een object van een bepaald datatype, zich ‘anders’ gedragen. Voeg de volgende regels toe aan de Application klasse:
var c2_1:Class1 = new Class2()
c2_1.talk() ;
Wat zal de output nu zij, “Hello world 1″ of “Hello world 2″? We testen de movie.
Hello world 1
Hello world 2
2
Hello world 2
c2_1 wordt gedeclareerd als van het datatype Class1, maar geïnstantieerd met Class2.
Omdat Class1 een Class2 is (zie bovenstaande regels), is dit geldig. De compiler genereert geen fout. At runtime, zal c2_1 een object toegewezen krijgen van het datatype Class2 en de implementatie van de functie ‘talk’ van de klasse Class2 uitvoeren.
Opmerking i.v.m. overerving
Overerving van klassen is essentieel binnen OO programmeren. Maar wordt meestal te snel toegepast, zodat je aan flexibiliteit inboet. Je mag pas een klasse overerven, indien de subklasse voldoet aan de volgende 2 eenvoudige, maar zeer belangrijke regels:
- De subklasse voldoet aan de “is een…“-regel. Bvb. een student is een persoon.
- De subklasse implementeert alle functies van de superklasse waarvan ze wil overerven.
In alle ander gevallen dient compositie i.p.v. overerving gebruikt te worden. Overerving is zeer verlijderlijk omdat het initieel (type)werk bespaart, maar het wordt moeilijker om terug te vinden, welke klasse een bepaalde functie implementeert.
In ActionScript wordt er – naar mijn mening – veel te snel een MovieClip overgeërft en daarmee gezondigd tegen bovenstaande regels (vooral de eerste). Ik zal voor het gebruik van een MovieClip in een klasse, altijd compositie gebruiken, waarbij ik meestal de MovieClip meegeef in de constructor.
Besluit
Met polyformisme wordt bedoeld dat een bepaald datatype, zich kan ‘gedragen’ als een datatype van de subklassen, omdat deze subklassen een functie van de superklasse anders implementeren.

