Site:  Cours VB.net  
5.1 Programmation Orientée Objet =POO.

VB.NET permet maintenant de faire de la POO (Programmation Orientée Objet)à part entière:

Il y a:

Les Classes du FrameWork.

On peut aussi CREER soi même (dans des modules de Classe) de nouvelles Classes qui suivront elles aussi les règles de la POO. Ces classes serviront à instancier des objets.

Pour ce chapitre, nous sommes du coté de l'application utilisatrice des objets (et non dans les objets).

L'objet est une boite (jaune ici!!), je l'utilise , mais je ne sais pas ce qui se passe à l'intérieur.

Interface et implémentation:

Nous savons déjà:

On utilise une Classe (le moule) pour instancier (créer) un objet.

Une classe est une combinaison de code et de données.

Exemple:

Prenons un objet d'une classe ListBox:

 

Encapsulation:

Le fait de ne pas voir l'implémentation (le code), c'est l'encapsulation.

Le code, les définitions de données sont privés à l'objet et non accessibles, ils sont enfermés, encapsulés dans une boite noire.

L'encapsulation permet donc d'exposer aux applications clientes uniquement l'interface.

Les applications clientes n'ont pas à se soucier  du fonctionnement interne.

Cela a une conséquence, si je modifie le code mais pas l'interface, l'application cliente n'a pas à être modifiée.

 

Héritage:

On a vu qu'un objet issu d'une Classe dérivée hérite des membres de la classe de base (la classe parent), cela crée une relation mère/fille (parent/enfant); la classe fille pouvant réutiliser les membres de la classe mère.

A noter qu'une classe ne peut hériter que d'une classe en VB.NET.

La Classe fille peut utiliser les membres de la classe mère, mais aussi ajouter ses propres membres ou redéfinir certains membres de la classe mère.

Exemple:

On a vu que quand on dessine une Form1, cela crée une Classe 'Form1' qui hérite des Windows.Forms  (Inherits System.Windows.Forms.Form)

Autre exemple:

ListBox hérite de Control

 

Polymorphisme:

Le nom de polymorphisme signifie "qui peut prendre plusieurs formes".

Tous les sites français donnent les mêmes définitions et entretiennent une certaine confusion. Il indiquent 3 types de polymorphisme et la différence entre polymorphisme 'paramétrique' de surcharge et ad ohc n'est pas évidente. Je vais donc expliquer les choses à ma manière!!

Il y a 4  sortes de polymorphisme:

Le polymorphisme ad hoc permet d'avoir des fonctions de même nom, avec des fonctionnalités similaires, dans des classes sans aucun rapport entre elles . Par exemple, la classe Integer, la classe Long et la classe Date peuvent avoir chacune une fonction ToString. Cela permettra de ne pas avoir à se soucier du type de l'objet que l'on a si on souhaite le transformer en String.

Une méthode gère des paramètres de type et de nom différents

Ce polymorphisme représente la possibilité de définir plusieurs méthodes de même nom mais possédant des paramètres différents (en nombre et/ou en type).

pour  ouvrir une fenêtre MessageBox, la méthode Show a 12 signatures, en voici 2:

Reponse= MessageBox.show(TexteAAfficher,Titre, TypeBouton etIcone, BoutonParDéfaut)
Ici on donne 4 paramètres.
 

Reponse= MessageBox.show(TexteAAfficher)

Ici 1 seul paramètre.

On appelle signature chaque combinaison d'arguments d'une fonction (combinaison en nombre et en type). Une fonction a donc autant de signatures que de manière d'appeler cette fonction C'est donc la signature d'une méthode qui détermine quel code sera appelé.

 

Quand une classe hérite d'une autre classe, elle hérite des méthodes. On peut redéfinir substituer une méthode de la classe parent par une méthode de même nom dans la classe enfant.

C'est la forme la plus naturelle du polymorphisme: elle permet d'appeler la méthode d'un objet sans devoir connaître son type. En VB 2005 cela correspond aux générics.

 

Constructeur, destructeur:

Un constructeur est une fonction effectuée lors de l'instanciation d'un objet de la Classe; il sert généralement à 'initialiser' l'objet. Il est appelé quand on fait  New.

Souvent il y a plusieurs signatures. Il y a habituellement un constructeur par défaut qui n'a pas de paramètres.

Exemple: pour créer un objet graphique  Point, j'utilise un constructeur permettant  de définir les coordonnées du point:

Dim P As New Point(45, 78)

La destruction d'un objet est effectué lorsqu'on lui affecte la valeur Nothing ou lorsqu'on quitte la portée où il a été défini.

P= Nothing

 

Accesseur, mutateur:

Un accesseur (accessor en anglais) est un membre renvoyant la valeur d'une propriété d'un objet.

MyObjet.GetName est un accesseur car elle renvoie la valeur de la propriété Name.

Un mutateur (mutator en anglais) ou encore modifieur (modifier en anglais) est un membre qui modifie la valeur d'une propriété d'un objet.

MyObjet.SetName est un mutateur car elle modifie la valeur de la propriété Name.
 

 

Déclaration, instanciation:

 On peut déclarer et instancier en même temps:

Dim P As New MaClasse

 

On peut séparer les 2 actions:

 

Dim P As Maclasse    'déclaration

P = New Maclasse    'instanciation

 

La déclaration et l'instanciation peuvent être effectuées dans les endroits différents:

 

Module Mon module

    Public P As As MaClasse

 

Sub MaRoutine

    P = New MaClasse

End Sub

End Module

 

Ici P est déclaré comme Public, il est instancié dans une Sub.

 

Propriétés, Méthodes:

Un Objet peut avoir une ou des Propriétés:

Dim B As New Button

B.Name ="toto"

 

Pour simplifier: une propriété d'un objet est une 'variable' associée à cet objet.

 

Un Objet peut avoir une ou des Méthodes:

Dim B As New Button

B.Click est une méthode.

 

Pour simplifier: Une méthode est un ensemble d'instructions (de lignes de codes) associées à un objet et qui effectue quelquechose .

 

Attention, on a accès aux propriétés du type en cours.

Exemple: dans Form_Load d'une form, le paramètre sender est bien la fenêtre qui a déclenché le Load mais sont type est 'Objet'. Et sender..ForeColor n'est pas accepté car Forecolor  n'est pas une propriété d'un objet.

 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Couleur=sender..ForeColor <=  ERREUR

End Sub

Pour pouvoir utiliser ForeColor, il faut caster l'objet en Form.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Couleur=CType(sender, Form).ForeColor

End Sub

 

Les Objets: ils sont 'By Ref':

On rappelle que les Objets sont 'By Ref' (Par référence)

 

Il faut comprendre qu'une variable Objet contient la référence, le pointeur de l'objet, mais pas l'objet lui même.

 

Cela entraîne:

 

1- Création de variable objet

Soit une classe Class1.

Dim I As Class1    On crée un pointeur vide, entraîne: I contient Nothing: il ne pointe sur aucun objet.

I = New Class1     Maintenant I contient la référence, le pointeur vers un objet de type Class1

                  le constructeur New a bien crée une instance de Class1

Habituellement on utilise en une fois:

Dim I As New Class1  

 

On peut voir si la variable contient Nothing : If IsNothing( I ) then.. ou If I Is Nothing..

 

 

2- Affectation:

Si on affecte une variable par référence à une autre, elle pointe toutes les 2 sur le même endroit mémoire: si j'en modifie une, cela modifie l'autre.

'Créons une Classe contenant un entier.

Class Class1
   Public Value As Integer = 0
End Class

Dim C1 As New Class1()
Dim C2 As Class1 =
C1    'on crée C2, on affecte C1 à C2
C2.Value = 123         
'on modifie C2
 

=> C1.Value=123  C2.Value=123   

Modifier C2 a modifié C1 car elles pointent sur le même endroit mémoire.

On le redit autrement: quand on crée C1 et C2, il n'y a pas 2 objets C1 et C2 mais 2 pointeurs vers le même objet.

3- Comparaison:

Deux objets peuvent être comparés par "Is".

Dim O As Object

Dim Q As Object  

If O Is Q then..

Equals peut être utilisé pour la comparaison:

Obj1.Equals(Obj2))  'Retourne True si Obj1 et Obj2 ont le même pointeur.