• Aucun résultat trouvé

Création d’une classe et de ses membres

Les membres d’un objet représentent les données et les fonctionnalités inhérentes à cet objet. Il peut y avoir des attributs, des méthodes, des propriétés et des événements. Les attributs et les propriétés représentent le côté "données" de l’objet, alors que les méthodes et les événements représentent le coté "fonctionnalités". Voyons comment créer une classe.

1 Tout d’abord, il faut indiquer que l’on va créer une classe :

Public Class Voiture

’ Tout ce qui ce sera dans cette partie concernera

la classe Voiture End Class

La programmation orientée objet Chapitre 9

165 LE GUIDE COMPLET

Cela délimite dans le programme l’endroit où sera décrite la classe Voiture.

2 Ensuite, il faut ajouter quelques attributs qui permettent de la définir.

Pour l’instant, le principe utilisé rappelle un peu celui des enregistrements. Mais le concept d’objet va au-delà, comme vous le verrez au fur et à mesure.

Public Class Voiture

’ Sa marque

Private marque As String

’ Son modèle

Private modele As String

’ Son année de mise en circulation Private anneeCircu As Integer

’ Sa puissance, en chevaux Private puissance As Integer

’ Le niveau d’essence, en litres Private essence As Integer End Class

3 Enfin, il faut ajouter quelques méthodes pour décrire les fonctionnalités.

Les méthodes sont des fonctions appliquées à une classe. Elles peuvent directement utiliser les attributs de la classe pour les traitements.

Cependant, pour des raisons de propreté du code source, utilisez plutôt Me.Meest un mot-clé qui désigne l’objet en cours. Il permet d’accéder à ses attributs et aux méthodes. De plus, si le paramètre de la méthode porte le même nom que l’un des attributs de la classe (ce qui est possible, mais pas recommandé),Mepermet de faire la distinction.

Public Class Voiture

’ Sa marque

Private marque As String

’ Son modèle

Private modele As String

’ Son année de mise en circulation Private anneeCircu As Integer

’ Sa puissance, en chevaux Private puissance As Integer

’ Le niveau d’essence, en litres Private essence As Integer

’ Méthode pour faire le plein

’ Exemple décrivant l’importance de Me Passer au niveau supérieur Chapitre 9

’ Évitez les noms de variable identiques

Public Sub faireLePlein(ByVal essence As Integer) Me.essence = Me.essence + essence

End Sub

’ Méthode pour tuner le moteur

Public Sub gonflerMoteur(ByVal cvGagnes As Integer) Me.puissance = Me.puissance + cvGagnes

End Sub End Class

Remarquez la présence des mots-clés Private et Public devant les attributs et les méthodes. Ils définissent le degré d’encapsulation du membre.

Encapsulation

L’encapsulation est l’un des mécanismes de la programmation orientée objet. Ce principe permet de séparer dans le programme l’interface et l’implémentation. Par "interface", on entend ce qui est visible par le monde extérieur. L’objet sera amené à être en relation avec d’autres objets. Par exemple, un véhicule va être en relation avec un conducteur ou avec un autre véhicule, avec une contravention. De cette manière, on garantit plus ou moins que, tant que cette interface n’est pas modifiée, les interactions avec l’extérieur restent valables. L’implémentation correspond à ce qu’il se passe à l’intérieur, c’est-à-dire le fonctionnement interne de l’objet. Celui-ci n’a pas besoin d’être connu de l’extérieur pour permettre à l’objet de bien fonctionner. Plus que cela, vous n’avez pas forcément envie que le reste du monde puisse accéder à vos secrets de fabrication. Cela est un peu imagé, mais permet d’expliquer les concepts d’interface et d’implémentation. En ce qui concerne la voiture, l’interface serait le fait qu’elle roule.

L’implémentation serait le fonctionnement du moteur à l’intérieur. Pour faire rouler la voiture, on n’a pas besoin de savoir comment cela se passe en interne. De plus, les constructeurs n’ont pas intérêt à divulguer les secrets de construction de leurs moteurs. Pour le programme informatique, il en est de même.

Il y a plusieurs degrés d’encapsulation, appelés "modificateurs d’accès" :

j Privé: traduit par le mot-cléPrivate, ce modificateur empêche tout élément qui ne fait pas partie de la classe en cours d’accéder au membre. D’un point de vue de la sécurité, il est recommandé La programmation orientée objet Chapitre 9

167 LE GUIDE COMPLET

de mettre tous les attributs en privé pour éviter toute modification intempestive.

j Public: traduit par le mot-clé Public, ce modificateur autorise l’accès au membre de n’importe où et par n’importe qui. En termes de sécurité, il ne convient pas aux attributs, mais pour les méthodes, c’est généralement le modificateur d’accès ad hoc.

j Protégé: traduit par le mot-clé Protected, ce modificateur autorise les classes qui dérivent de la classe en cours d’accéder au membre. Cela intervient lors de l’héritage, qui est un autre mécanisme important de la programmation objet (nous y reviendrons plus loin).

j Interne: traduit par le mot-clé Friend, ce modificateur limite l’accès au membre exclusivement aux types du même assemblage. L’assemblage correspond en fait au programme. Son utilisation est subtile et n’entre pas le cadre de cet ouvrage. Mais sachez qu’il existe.

j Interne protégé: cumule les possibilités d’accès deFriendet de Protected. Le membre est accessible soit aux types de l’assemblage, soit aux classes qui héritent de la classe en cours.

Les modificateurs les plus importants et les plus utiles sontPublic et Private. Il sera question de Protected lorsque nous aborderons l’héritage. Voyons un peu les différences entre les attributs Public et Private et comment en tirer le meilleur parti. Voici deux classes et quelques membres :

Class Voiture

’ Attribut année de mise en circulation Public anneeCirculation As Integer End Class

Class Personne

’ Tentative de modification de l’année de mise en

circulation

Public Sub frauderVoiture(laVoiture As Voiture)

laVoiture.anneeCirculation = laVoiture.anneeCirculation

+ 5 End Sub End Class

La méthode frauderVoiture traduit l’intention d’une personne d’augmenter l’année de mise en circulation du véhicule pour simuler le fait que celui-ci est plus récent. D’un point de la programmation, il n’y pas d’erreur : le programme se compilera et s’exécutera sans souci. Il

Passer au niveau supérieur Chapitre 9

sera alors possible de modifier la date de mise en circulation d’une voiture sans problème. Pas très sécurisant n’est-ce pas ? C’est pourquoi il est recommandé, dans la mesure du possible, de définir les attributs comme privés, de manière que l’extérieur ne puisse pas provoquer de comportement non autorisés. Essayons de remédier à ce problème :

Class Voiture

’ Marque et modèle Private marque As String

’ Attribut année de mise en circulation Private anneeCirculation As Integer End Class

Class Personne

’ Tentative de modification de l’année de mise en

circulation

Public Sub frauderVoiture(laVoiture As Voiture)

laVoiture.anneeCirculation = laVoiture.anneeCirculation

+ 5 End Sub

’ Passer une annonce de vente

Public Sub vendreVoiture(laVoiture As Voiture) Dim texteAnnonce As String

texteAnnonce = "Vends voiture " & laVoiture.marque texteAnnonce = texteAnnonce & " immatriculée en "

texteAnnonce = texteAnnonce & Voiture.anneeCirculation MessageBox.Show(textAnnonce)

End Sub End Class

Le problème précédent est réglé. La méthodefrauderVoiturene peut plus fonctionner, car elle n’a plus accès au membre anneeCirculation, celui-ci étant maintenant privé. Cela provoquera une erreur à la compilation. On ne peut accéder au membre car celui-ci est privé.

Figure 9.1: Erreur d’accès à un membre privé

La programmation orientée objet Chapitre 9

169 LE GUIDE COMPLET

La fonction vendreVoiture pose un autre problème. En effet, il est impossible de construire le texte de l’annonce, étant donné que la personne n’a pas accès à la marque de la voiture ni à l’année de mise en circulation. Les attributs ne sont plus du tout visibles de l’extérieur, et perdent alors leur intérêt. Pour remédier à ce problème, on utilise des méthodes publiques, qui manipulent les données et qui sont accessibles de l’extérieur. De cette manière, l’accès aux attributs est permis, mais vous gardez un contrôle sur ce que peut faire l’extérieur.

Class Voiture

’ Marque et méthode d’accès Private marque As String

Public Function getMarque() As String getMarque = Me.marque

End Function

’ Attribut année de mise en circulation Private anneeCirculation As Integer

’ Méthode pour accéder à la date de mise en circulation Public Function getAnneeCircu() As Integer

getAnneeCircu = Me.anneeCircu End Function

End Class Class Personne

’ Tentative de modification de l’année de mise en

circulation

Public Sub frauderVoiture(laVoiture As Voiture)

laVoiture.anneeCirculation = laVoiture.anneeCirculation

+ 5 End Sub

’ Passer une annonce de vente

Public Sub vendreVoiture(laVoiture As Voiture) Dim texteAnnonce As String

texteAnnonce = "Vends voiture " & laVoiture.getMarque() texteAnnonce = texteAnnonce & " immatriculée en "

texteAnnonce = texteAnnonce & laVoiture.getAnneeCircu() MessageBox.Show(textAnnonce)

End Sub End Class

Ainsi, les attributs sont bien protégés car ils sont privés. Cependant, on peut les utiliser quand même grâce aux méthodes getMarque et getAnneeCircu. Ces deux méthodes publiques correspondent à l’interface de la classeVoiture, et le reste à son implémentation.

Passer au niveau supérieur Chapitre 9