Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/Le polymorphisme
Le polymorphisme
[modifier | modifier le wikicode]Le polymorphisme est un concept essentiel de la programmation orientée objet. Ce concept est intimement lié à l'héritage.
Gambas utilise le dispatching virtuel selon le wiki officiel. Cela signifie qu'en cas d'appel de méthode, il cherche d'abord la méthode dans les classes fille. S'il ne trouve pas la méthode dans la classe fille, il remonte dans la classe parente.
Dans la pratique, vous rassemblez des objets qui se ressemblent dans une collection. Mais chaque objet aura un comportement qui lui est propre. Certains objets agiront différemment des autres.
L'exemple ci-dessous utilise des objets de type "Bateau". Ces objets sont créés avec les classes dérivées "Bateau à moteur" et "Bateau à voile". Un "Bateau à moteur" EST UN "Bateau". Un "Bateau à voile" EST UN "Bateau" lui aussi. Il y a donc une relation d'héritage entre ces classes. Toutes ces classes partagent plusieurs méthodes comme "RaffraichirPosition" ou "Demarrer" ou "Stopper". Vous l'aurez compris, un "Bateau à moteur" n'avance pas comme un "Bateau à voile" et le code sera donc différent dans les classes.
' Gambas class file
' FMain (partielle)
Private v As Boat ' <<--- bateau
Private v2 As Boat ' <<--- bateau
Public Sub Form_Open()
Dim x As Integer
Dim y As Integer
v2 = New Motorboat ' <<--- bateau à moteur
v = New Sailboat ' <<--- bateau à voile
x = DrawingArea1.Width \ 2
y = DrawingArea1.height \ 2
v.Cap = 90
v.Speed = 0.0
v.XPosition = x
v.YPosition = y
v2.Cap = 180
v2.Speed = 0.0
v2.XPosition = 40
v2.YPosition = 40
DrawingArea1.Refresh()
TimerVoilier.Start()
End
Public Sub DrawingArea1_Draw()
v.Draw() ' <<--- bateau qui est un bateau à voile
v2.Draw() ' <<--- bateau qui est un bateau à moteur
End
Public Sub Timer_Timer()
If ToggleButtonGaz1.Value = True Then
v.Gaz()
Endif
v.Move()
If ToggleButtonGaz2.Value = True Then
v2.Gaz()
Endif
v2.Move()
DrawingArea1.Refresh()
End
' ... (plus du code ci-dessous) ...
En résumé :
- Lorsque vous appelez
objet.Methode()
depuis un module, ouMe.Methode()
depuis la classe, c'est la Methode() du type réel qui est exécutée. - Il est possible de faire des collections d'objets typés "Parent" qui contiennent des objets typés "Enfant".