Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/Le polymorphisme

Le polymorphisme

modifier

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, ou Me.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".