|
Site |
Cours VB.net |
|
|
|
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 SubEnd 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 SubLa méthode
Fmontre 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éthodeGmontre 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éthodeMain, 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
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
|
|
|
|
|