|
Site |
Cours VB.net |
|
|
|
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.
Le code et la définition des données constituent l'implémentation (c'est à l'intérieur de la boite).
L'interface de l'objet est l'ensemble de ses membres visibles et utilisables (les membres sont les propriétés, les méthodes, les évènements).
Exemple:
Prenons un objet d'une classe ListBox:
L'interface c'est ListBox.Visible ListBox.AddItem...Je la vois , je peux l'utiliser.
L'implémentation, je ne la vois pas, c'est le code qui gère la ListBox, la définition des éléments; c'est une 'boite noire', je ne sais pas ce qui s'y passe, je n'y est pas accès, et c'est tant mieux!!!
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.
|
|
|
|
|