Aller au menu - Aller au contenu

Icône Notre première classe

Avatar
Mise à jour : 13/12/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
23 410 visites depuis 7 jours, dont 279 sur ce chapitre classé 14/786
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Notre première classe

Pour commencer notre entrée dans le monde des Classes je vous propose d'attaquer tout de suite sur un petit thème.

Pourquoi pas Mario ?

Eh bien nous allons essayer de faire bouger Mario pour commencer.

Logiquement, puisque nous sommes sur la partie traitant de la POO, notre Mario sera un ... Objet.

La classe


Créons tout de suite notre "moule" de Mario.

Créez donc un nouveau projet, toujours Windows Forms. Ajoutez ensuite un nouvel élément, comme ce que nous avons fait pour une fenêtre mais cette fois choisissez :

Image utilisateur


C'est donc un fichier de classe.

Nommez tout de suite ce fichier en Mario par exemple.

Nous voilà donc avec notre classe "Mario" totalement vide, juste la déclaration de début et de fin.

L'interface



Retournons dans notre fenêtre et ajoutons-y quelques contrôles pour pouvoir commencer.

Image utilisateur


Donc j'ai juste ajouté un petit PANEL dans lequel j'ai spécifié la taille : 20x20 et la couleur de fond : Rouge.

J'ai ajouté en bas un petit bouton qui va nous permettre de déplacer ce panel. Pour le moment uniquement vers la droite.

Vous vous doutez que coder l'évènement qui va permettre au bouton de déplacer ce panel ne va pas être sorcier : quelques location à définir et le tour est joué.

Oui mais nous allons définir une classe qui va pouvoir s'adapter à d'autres situations (eh oui vous pourrez utiliser vos classes dans d'autres programmes.)

Réfléchissons un peu



Un léger moment de réflexion.

Pour le moment je vous ne demande pas de créer une classe vous-même, nous n'avons pas encore vu comment faire, nous allons le faire ensemble.

Je vous demande juste d'essayer de trouver comment rendre cet objet adaptable.

Mario doit être capable de se déplacer par "cases" pour le moment la taille de la case est définie par la taille du panel.

Image utilisateur

Donc si mon panel devient de 50x50, une case sera égale à 50x50 (les cases sont dans votre imagination mais vous pouvez placer des lignes de manière à faire une grille.

Notre classe ne pourra pas agir directement sur notre panel, c'est toujours le code qui l'a appelé qui va devoir le modifier, notre classe va donc devoir nous renvoyer des coordonnées. Les coordonnées de la nouvelle position de Mario.

Donc si vous avez suivi ma (fastidieuse) réflexion, nous allons devoir travailler avec des variables de type Point, nous aurions pu nous envoyer des int contenant la position en X et en Y mais la variable point rassemble le tout.

Nous allons aussi devoir passer à la classe la taille de notre panel, pour qu'elle puisse travailler dynamiquement, quelle que soit la taille de notre Mario.

Bon, trêves de commentaires, allons-y.

Notre classe



Dans notre fichier classe il va falloir tout d'abord définir un constructeur.

Rendez-vous dans le fichier Mario.vb (la classe) et insérez la déclaration du constructeur (avec New).

On se place dans le "Class Mario" et on inscrit :

Code : VB.NET
1
2
3
Sub New()

    End Sub


Voilà notre premier constructeur.

Ce constructeur de demande aucun argument. Nous ferions tout de même bien de spécifier à la classe la position originelle de notre Mario et sa taille.

Pour cela commençons par déclarer des variables en Privé car elles ne seront accessibles qu'à partir de la classe.

Juste en dessous de Public Class Mario, déclarez :

Code : VB.NET
1
2
Private _CoordonneesActuelles As Point
    Private _Taille As Size


J'ai donc les coordonnées actuelles de notre Mario de type Point, et la taille de type Size.

Pourquoi "_" devant tes variables ?


C'est une vieille habitude, lorsque je déclare des membres ou des attributs privés, je les précède d'un "_", vous n'êtes pas obligés de faire comme moi.

Ces variables sont déclarées en Global elles seront donc accessibles de partout dans la classe.

Changeons notre constructeur de manière à demander en arguments ces valeurs :


Code : VB.NET
1
2
3
4
Sub New(ByVal PositionOriginelle As Point, ByVal TailleMario As Size)
        _CoordonneesActuelles = New Point(PositionOriginelle)
        _Taille = New Size(TailleMario)
    End Sub


Et entrons les dans les variables.

Vu que point et size sont eux même des objets, il faut les instancier avec "New".

Nous voilà donc avec la taille et les coordonnées de notre Mario.

Des méthodes et des attributs

Je rappelle rapidement ce que ces mots signifient :

Les méthodes sont des fonctions de type privées, leur nécessité est interne, rien n'est visible depuis l'extérieur.
Les attributs quand à eux sont publics, visibles depuis l'extérieur, accessibles.

Eh bien codons quelques fonctions qui vont nous permettre de déplacer notre Mario.

A première vue, rien de problématique, on va jouer sur la propriété .X de nos coordonnées pour déplacer Mario en horizontal, .Y pour le vertical.

Mais de combien allons-nous le bouger ?

C'est là que notre notion de "cases" et de taille intervient. On va le faire bouger d'une case.

Créons une nouvelle fonction de type Public.

Cette fonction sera destinée à faire avancer Mario d'une case. Appelons là donc Avance.

Code : VB.NET
1
2
3
Public Sub Avance()
        _CoordonneesActuelles.X = _CoordonneesActuelles.X + _PasX()
    End Sub


C'est quoi _PasX ?


Une petite fonction qui nous renvoie la taille en longueur de Mario (pour savoir quelle est la valeur de la case en longueur).
Eh oui, je ne lésine pas sur les fonctions. Elle est précédée de "_" car c'est un attribut, elle est private :

Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#Region "Fonctions privées"

    Private Function _PasX()
        Return _Taille.Width
    End Function

    Private Function _PasY()
        Return _Taille.Height
    End Function

#End Region


Je renvoie simplement la longueur, pour le pasY, c'est la hauteur.

Si vous avez suivi, cette méthode publique va déplacer Mario d'une case sur la droite.

Oui mais ce n'est pas une fonction, on a aucun retour, comment est-ce que notre panel va bien pouvoir se déplacer ?

Il va falloir se servir des propriétés.

Les propriétés

Vous savez déjà ce que c'est que les propriétés, vous en assignez tout le temps quand vous modifiez vos contrôles.

On va apprendre à faire de même pour nos objets.

La syntaxe de déclaration d'une propriété est assez particulière.
Image utilisateur


Il va falloir gérer lorsqu'on assigne cette propriété et lorsqu'on la récupère.

Pour commencer voici la syntaxe :
Code : VB.NET
1
2
3
4
5
6
7
8
Public Property Position()
        Get

        End Get
        Set(ByVal value)

        End Set
    End Property


Vous voyez qu’elle fonctionne comme une fonction sauf qu'à l'intérieur on a deux nouveaux mots clés :

  • Set : sera appelée lorsque l'on assignera une valeur à cette propriété
  • Get : sera appelée lorsque l'on demandera une valeur à cette propriété


Pour le moment l'argument fournit au Set n'a pas de type défini, ce qui est renvoyé non plus, commençons par les définir :

Code : VB.NET
1
2
3
4
5
6
7
8
Public Property Position() As Point
        Get

        End Get
        Set(ByVal value As Point)

        End Set
    End Property


On attend donc un point et on renvoie un point.

Notre propriété va seulement assigner la valeur à la variable _CoordonneesActuelles et renvoyer sa valeur, rien de bien sorcier (vous pouvez même le faire tout seul) mais on aurait pu effectuer beaucoup d'autre choses en même temps. Assigner plusieurs variables, incrémenter un compter, les possibilités sont infinies =).

Voici donc la propriété au final :

Code : VB.NET
1
2
3
4
5
6
7
8
Public Property Position() As Point
        Get
            Return _CoordonneesActuelles
        End Get
        Set(ByVal value As Point)
            _CoordonneesActuelles = value
        End Set
    End Property


On assigne la valeur, on la retourne.

Voici notre première propriété.

Avec cette nouvelle propriété et la fonction précédente on peut désormais retourner sur notre code relatif à la fenêtre et faire bouger Mario simplement en quelques lignes :

Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Public Class PlateauDeJeu

    'Mario déclaré en global
    Dim MonMario As Mario
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Un nouveau Mario
        MonMario = New Mario(Me.PAN_MARIO.Location, Me.PAN_MARIO.Size)
    End Sub

    Private Sub BT_AVANCE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_AVANCE.Click
        'On le fait avancer
        MonMario.Avance()
        'On recupère la nouvelle position
        Me.PAN_MARIO.Location = MonMario.Position
    End Sub

End Class


Voici mon code relatif à la fenêtre.

Je déclare un Mario en variable globale, donc il sera accessible et utilisable pendant toute la durée de vie de la fenêtre.
Je l'instancie au load de la fenêtre en passant la position du panel et ses dimensions en paramètres au constructeur.

Puis lors du clic sur le bouton, on fait avancer Mario et on récupère sa nouvelle position pour l'affecter au panel.

Vous pouvez essayer.

Notre petit Mario

Une petite partie qui n'a aucun rapport mais c'est pour vous mettre le reste du code de notre déplacement de Mario, on s'en servira sûrement plus tard.

Voici donc a quoi ressemble ma fenêtre finale (on mettra une image de Mario plus tard =) ) :

Image utilisateur

Ma classe :

Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Public Class Mario

    Private _CoordonneesActuelles As Point
    Private _Taille As Size

    Sub New(ByVal PositionOriginelle As Point, ByVal TailleMario As Size)
        _CoordonneesActuelles = New Point(PositionOriginelle)
        _Taille = New Size(TailleMario)
    End Sub

    Public Sub Avance()
        _CoordonneesActuelles.X = _CoordonneesActuelles.X + _PasX()
    End Sub

    Public Sub Recule()
        _CoordonneesActuelles.X = _CoordonneesActuelles.X - _PasX()
    End Sub

    Public Sub Monte()
        _CoordonneesActuelles.Y = _CoordonneesActuelles.Y - _PasY()
    End Sub

    Public Sub Descend()
        _CoordonneesActuelles.Y = _CoordonneesActuelles.Y + _PasY()
    End Sub

    Public Property Position() As Point
        Get
            Return _CoordonneesActuelles
        End Get
        Set(ByVal value As Point)
            _CoordonneesActuelles = value
        End Set
    End Property

#Region "Fonctions privées"

    Private Function _PasX()
        Return _Taille.Width
    End Function

    Private Function _PasY()
        Return _Taille.Height
    End Function

#End Region

End Class


J'ai rajouté des déplacements.

Et la code final avec la gestion des touches :

Code : VB.NET
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Public Class PlateauDeJeu

    'Mario déclaré en global
    Dim MonMario As Mario

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Se met en écoute des touches
        Me.KeyPreview = True
        'Un nouveau Mario
        MonMario = New Mario(Me.PAN_MARIO.Location, Me.PAN_MARIO.Size)
    End Sub

    Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles Me.KeyDown
        Select Case e.KeyCode
            Case Keys.Z
                MonMario.Monte()
            Case Keys.S
                MonMario.Descend()
            Case Keys.Q
                MonMario.Recule()
            Case Keys.D
                MonMario.Avance()
        End Select
        Me.PAN_MARIO.Location = MonMario.Position
    End Sub


#Region "Boutons de l'interface"

    Private Sub BT_AVANCE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_AVANCE.Click
        'On le fait avancer
        MonMario.Avance()
        'On recupère la nouvelle position
        Me.PAN_MARIO.Location = MonMario.Position
    End Sub

    Private Sub BT_RECULE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_RECULE.Click
        'On le fait reculer
        MonMario.Recule()
        'On recupère la nouvelle position
        Me.PAN_MARIO.Location = MonMario.Position
    End Sub

    Private Sub BT_DESCEND_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_DESCEND.Click
        'On le fait descendre
        MonMario.Descend()
        'On recupère la nouvelle position
        Me.PAN_MARIO.Location = MonMario.Position
    End Sub

    Private Sub BT_MONTE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_MONTE.Click
        'On le fait monter
        MonMario.Monte()
        'On recupère la nouvelle position
        Me.PAN_MARIO.Location = MonMario.Position
    End Sub

#End Region

End Class


Voilà. Amusez-vous bien.
Chapitre précédent Sommaire Chapitre suivant

Partager

11 commentaires pour "Notre première classe"
Note moyenne : 3.60 / 4 (543 votes)
Pseudo Commentaire
Hors ligne Pabloxo # Posté le 09/04/2011 à 08:11:18

Salut à tous

Moi j'ai un soucis, mon programme marché très bien les deux première fois que je l'ai lancé
Mais après il m'a mis comme quoi la valeur ne devait pas être de zéro. Problème je ne sait pas de quelle valeur il sagit, ni comment résoudre ça.
En attendant j'essaye de programmer sur la même feuille un luigi Une sorte de mini-arcade quoi

(je précise mon problème est survenue avant que je code le luigi)

Merci d'avance ;)

"Dans la vie on ne te donne rien c'est à toi de prendre"
 
Hors ligne JaneLaTarzanne # Posté le 15/04/2011 à 14:15:52

Études : IUT A Toulouse

Citation : Hankerspace
Les méthodes sont des fonctions de type privées, leur nécessité est interne, rien n'est visible depuis l'extérieur.
Les attributs quand à eux sont publics, visibles depuis l'extérieur, accessibles.


Houla !
Partir de zéro ne veut pas dire enseigner des notions fausses en fusionnant deux concepts qui ne devraient pas l'être... Je suis d'accord pour afficher une certaine tolérance quant aux termes techniques employés (bien que trop souvent utilisés à tort dans ce tuto) mais là c'est la notion même d'objet que tu détruis et qui me semble tout de même capitale à comprendre pour ce langage.

Objet = Identité + Comportement + Etat


  • Les méthodes sont effectivement les fonctions de l'objet, elles définissent son comportement, ce qu'il fait et comment il agit (i.e. une voiture avance)
  • Les attributs ne sont en aucun cas des fonctions !!! Ce sont eux qui définissent l'état d'un objet, comment il est à un instant donné. Ce sont donc des variables (i.e. une voiture est rouge, plus tard elle sera peut être bleue ?)
  • Une méthode n'est pas spécialement publique, de même qu'un attribut n'est pas forcément privé (d'ailleurs tu as inversé les deux) mais il est tout de même fortement conseillé de les laisser visible qu'à l'intérieur de la classe pour plus de sécurité.


Pour ton prochain tuto, pense à te renseigner plus amplement sur les notions que tu utilises avant d'inculquer des concepts complètement faux. Pour l'instant je n'ai plus trop confiance sur la qualité des cours proposés...

PS : Merci tout de même pour le côté graphique + prog VB qui m'a été bien utile. ^^

"Le lol est au Kévin ce que le ; est au programmeur"
 
Hors ligne Garouda # Posté le 05/01/2012 à 08:58:19

Je m'excuse JeanneLaTarzane je m'inscris en faux contre ce genre de commentaires qui a part se faire mousser, ne servent a rien. (Desole, pas d'accent sur mon clavier US/Thai... je devrais faire Alt+0224 pour avoir à, etc.) Je trouve ce tuto plutot bien fait et je serais ravi de pouvoir suivre le votre. La critique est aisee mais l'art difficile.
Je suis en pleine reconversion d'une application que j'ai ecrite en VB6 et merci au site du zero pour ces tutos.
Hors ligne shurikenzl # Posté le 02/03/2012 à 15:12:03

Citation : Garouda
Je m'excuse JeanneLaTarzane je m'inscris en faux contre ce genre de commentaires qui a part se faire mousser, ne servent a rien.

Ne vous en déplaise, heureusement que ce genre de commentaire est fait. Il souligne très justement, qu'une partie de ce cours n'est pas exacte. En faite, tous les débutants qui vont lire les deux lignes en bas de mon commentaire vont prendre pour base des choses inexactes et vont mécaniquement rien y comprendre.

Le concept objet n'est déjà pas quelque chose d'aisé à assimiler, alors apprendre le concept objet avec de l'à peu près, forcément ça complique les choses.

Ca n'enlève en rien que ce cours sur le VB.NET est dans son ensemble très bon.

Citation
Les méthodes sont des fonctions de type privées, leur nécessité est interne, rien n'est visible depuis l'extérieur.
Les attributs quand à eux sont publics, visibles depuis l'extérieur, accessibles.
Hors ligne Hedmont # Posté le 26/04/2012 à 23:24:09

J'ai absolument rien compris a cette partie (enfin sur toute la partie sur les objets quoi)...

Mais merci tout de même du taff fourni. C'est cool de votre part !!

Voir tous les commentaires