Site:  Cours VB.net  
5.2.2 Création de Classe (Suite).

 

Pour la suite de ce chapitre, nous sommes toujours DANS la Classe de l'objet ( et non dans l'application utilisatrice).

DANS la boite.

Me , My, MyClass, MyBase.

Résumons:

Me c'est l'instance en cours.

Me.text dans une form, c'est le texte de la barre de titre de la form en cours.

My c'est un moyen rapide d'avoir accès à des classes de l'application, de l'ordinateur, des ressources...

Me.Icon = My.Resources.MyIcon

 

Jouer un son qui est dans les ressources.
My.Computer.Audio.Play(My.Resources.Form1Greeting, AudioPlayMode.Background)

 

MyClasse c'est l'instance en cours. Mais à la différence de Me, c'est le méthode de la classe de base (Parente) qui est appelée si cette méthode a été substituée.

 

 

MyBase c'est la classe parente.
 

MyBase est couramment utilisé pour accéder aux membres de la classe de base qui sont substitués ou occultés dans une classe dérivée. MyBase.New permet d'appeler explicitement un constructeur de classe de base (parente) d'un constructeur de classe dérivé.

 

 

Propriété par défaut

Default sert à indiquer de la propriété est la propriété par défaut.

 

Créons une property par défaut:

Class MyClasse

Default Property MonItem As String

..

End Property

End Class

 

Maintenant, il n'est plus nécessaire d'utiliser le nom de la propriété quand on y accède.

Dim MyCollection As New MyClasse

On peut écrire:

MyCollection.MonItem (index)

ou

MyCollection(index)    'MonItem est omis

 

Bien sur, il ne peut y avoir qu'une seule property par défaut.

 

Méthode de Classe avec Shared:

 

Vous pouvez ajouter à votre membre : Shared. Cela signifie que la variable, la propriété ou la méthode déclarée comme Shared est partagée par toutes les instances de la classe: c'est une méthode de classe.

 

Une méthode déclarée dans une classe sans modificateur Shared est appelée méthode d'instance. Une méthode d'instance opère sur une instance donnée.

Pour une variable non Shared, dans chaque instance la variable a sa valeur propre. 

Une variable Shared est commune à toutes les instances de la Class et même à la Classe elle-même sans avoir besoin de l'instancier. C'est une variable de Classe.

L'exemple suivant illustre les règles d'accès aux membres d'instance et Shared :

Class Test
   Private _x As Integer
   Private Shared _y As Integer
   
   Sub F()
      _x = 1 ' Ok, c'est équivalent à Me._x = 1.
      _y = 1 ' Ok, c'est équivalent à Test._y = 1.
   End Sub
   
   Shared Sub G()
      _x = 1 ' Erreur, on ne peut accéder à Me._x.
      _y = 1 ' Ok, c'est équivalant à Test._y = 1.
   End Sub
End Class
   
   Shared Sub Main()
      Dim t As New Test()
      t._x = 1 ' Ok.
      t._y = 1 ' Ok.
      Test._x = 1 ' Erreur, on accède à x seulement par une instance.
      Test._y = 1 ' Ok  on peut accéder à y avec le nom de la classe car y est shared.
   End Sub

La méthode F montre que, dans une fonction d'instance membre, un identificateur peut être utilisé pour accéder à des membres d'instance et à des membres Shared. La méthode G montre que, dans une fonction membre Shared, il est erroné d'accéder à une instance membre via un identificateur. En d'autres termes dans une méthode Shared on n'a accès qu'au variable Shared. Quant à la méthode Main, elle montre que, dans une expression d'accès au membre, l'accès aux membres d'instance s'effectue par l'intermédiaire des instances, alors que l'accès aux membres Shared est possible via des types ou des instances.

 

Création d'un compteur d'instance.

Je veux savoir combien il a été crée d'instance de 'Médicament':

Class MyClasse

'Créons une variable commune à toutes les instances 

Private Shared Nb as Integer=0

'Le constructeur va l'incrémenter à chaque instanciation:

Sub New()

    Nb+=1

End sub

 

'Il suffit de lire sa valeur pour savoir le nombre d'objet Medicament :

Public ReadOnly Property NbInstance()

    Get

        NbInstance=Nb

    End Get

End Property

 

End Class

 

Création d'un identifiant unique d'instance.

Pour chaque instance, je veux avoir un identifiant unique, un  globally unique identifier (GUID).

Private m_ID As System.Guid

Sub New()
    m_ID = System.Guid.NewGuid
End Sub

Exemple d'identifiant unique:

'0f8fad5b-d9cb-469f-a165-70867728950e  

Chaque instance ayant un identifiant unique, je peux ainsi 'repérer' les instances (en créant une property ReadOnly afin de lire cet identifiant)

Il existe une très faible probabilité pour que le nouveau GUID soit égal à zéro ou égal à un autre GUID

 

 

Singleton

Parfois , on a une classe  avec laquelle on veut créer une instance et une seule.

Private Sub New()
New doit-être toujours private pour empêcher d'instancier avec New

Un singleton est construit grâce à une méthodes de classe  nommé 'GetInstance' (sans avoir à instancier).

Shared Function getInstance() As sing
Cette fonction qui s'appelle toujours getInstance va servir à instancier une fois la variable Instance.

Shared instance As sing
Cette variable est la base du Singleton. Elle s'appelle  Instance (par convention) elle est du même type que la class et contient l'instance unique.


Public Class sing

'Déclaration de l'instance Singleton

Shared instance As sing

 

Private Sub New()'Pas oublier de mettre Private 

    MyBase.New()

End Sub

Shared Function getInstance() As sing 'Voici la méthode de classe

 

If IsNothing(instance) Then 'Si le singleton n'est pas créé, alors faut le créé

    instance = New sing

End If

Return instance

End Function

...

...

End Class

Comment utiliser cette Classe?

Dim t As sing =  sing.getInstance

Remarque:

    Si on fait ensuite Dim t1 As sing =  sing.getInstance c'est la même instance qui est retournée. On ne peut en créer qu'une..

    Si on écrit  Dim t As New sing  :cela plante.


On peut ajouter une protection contre les multi thread trop rapide avec
SyncLock GetType(sing)

 

    Shared Function getInstance() As sing

        

        If IsNothing(instance) Then

            SyncLock GetType(sing)

                 If IsNothing(instance) Then

                    instance = New sing

                end if

            End SyncLock

        End If

        Return instance

    End Function