Tout d'abord, voici un résumé/une comparaison très rapide de l'approche de base et des trois premières réponses.
L'approche de base : Ce sont les moyens de base pour construire de nouvelles instances d'une classe :
Dim newEmployee as Employee
Dim newLunch as Lunch
'==Very basic==
Set newEmployee = new Employee
newEmployee.Name = "Cam"
newEmployee.Age = 42
'==Use a method==
Set newLunch = new Lunch
newLunch.Construct employeeName:= "Cam" food:="Salad", drink:="Tea"
Ci-dessus, Construct
serait un sous de la classe Lunch qui assigne les valeurs des paramètres à un objet.
Le problème est que, même avec une méthode, il fallait deux lignes, la première pour définir le nouvel objet, et la seconde pour remplir les paramètres. Ce serait bien de faire les deux en une seule ligne.
1) La classe Factory (bgusach) : Créez une classe distincte ("Factory"), avec des méthodes permettant de créer des instances de toute autre classe souhaitée, y compris des paramètres de configuration.
Utilisation possible :
Dim f as Factory 'a general Factory object
Dim newEmployee as Employee
Dim newLunch as Lunch
Set f = new Factory
Set newEmployee = f.CreateEmployee("Bob", 25)
Set newLunch = f.CreateLunch("Bob", "Sandwich", "Soda")
Quand vous tapez "f." dans la fenêtre de code, après que vous ayez Dim f as Factory
vous voyez un menu de ce qu'il peut créer via Intellisense.
2) Le module d'usine (stenci) : Idem, mais au lieu d'une classe, Factory peut être un module standard.
Utilisation possible :
Dim newEmployee as Employee
Dim newLunch as Lunch
Set newEmployee = CreateEmployee("Jan", 31) 'a function
Set newLunch = CreateLunch("Jan", "Pizza", "JuiceBox")
En d'autres termes, nous créons simplement une fonction en dehors de la classe pour créer de nouveaux objets avec des paramètres. De cette façon, vous n'avez pas besoin de créer ou de faire référence à un objet Factory. Vous ne bénéficiez pas non plus de l'intellisense as-you-type de la classe factory générale.
3) L'instance globale (Mathieu Guindon) : Nous revenons ici à l'utilisation d'objets pour créer des classes, mais en nous en tenant à la classe à créer. Si vous modifiez le module de classe dans un éditeur de texte externe, vous pouvez appeler les méthodes de la classe avant de créer un objet.
Utilisation possible :
Dim newEmployee as Employee
Dim newLunch as Lunch
Set newEmployee = newEmployee.MakeNew("Ace" 50)
Set newLunch = newLunch.MakeNew("Ace", "Burrito", "Water")
Ici MakeNew
est une fonction comme CreateEmployee
o CreateLunch
dans la classe générale de l'usine, sauf qu'ici elle est dans la classe à fabriquer, et donc nous n'avons pas à spécifier quelle classe elle va fabriquer.
Cette troisième approche a un aspect fascinant de "création à partir d'elle-même", permis par l'instance globale.
D'autres idées : Auto-instauration, méthode Clone ou classe de collection parentale. Avec l'instanciation automatique ( Dim NewEmployee as new Employee
(notez le mot "nouveau"), vous pouvez obtenir quelque chose de similaire à l'instance globale sans le processus de configuration :
Dim NewEmployee as new Employee
NewEmployee.Construct("Sam", 21)
Avec "nouveau" dans le Dim
l'objet NewEmployee est créé comme une étape préalable implicite à l'appel de sa méthode. Construct
est un Sub dans la classe Employee, comme dans l'approche de base. [1]
L'instanciation automatique pose quelques problèmes ; certains la détestent, d'autres la défendent. 2 Pour limiter l'auto-instauration à un seul proto-objet, vous pouvez ajouter une balise MakeNew
à la classe, comme je l'ai fait avec l'approche de l'instance globale, ou modifiez-la légèrement comme suit Clone
:
Dim protoEmployee as new Employee 'with "new", if you like
'Add some new employees to a collection
Dim someNames() as Variant, someAges() as Variant
Dim someEmployees as Collection
someNames = array("Cam", "Bob", "Jan", "Ace")
someAges = array(23, 45, 30, 38)
set someEmployees = new Collection
for i = 0 to 3
someEmployees.Add protoEmployee.Clone(someNames(i), someAges(i))
next
Ici, le Clone
peut être configurée avec des paramètres facultatifs Function Clone(optional employeeName, optional employeeAge)
et utiliser les propriétés de l'objet appelant si aucune n'est fournie.
Même sans auto-instantation, une MakeNew
o Clone
au sein de la classe elle-même permet de créer de nouveaux objets en une seule ligne, une fois que vous avez créé le proto-objet. Vous pourriez utiliser l'auto-instauration pour un objet de fabrique générale de la même manière, pour économiser une ligne, ou pas.
Enfin, vous pourriez vouloir une classe parent. Une classe parent pourrait avoir des méthodes pour créer de nouveaux enfants avec des paramètres (par exemple, avec Employees comme collection personnalisée, set newEmployee = Employees.AddNew(Tom, 38)
). Pour de nombreux objets dans Excel, c'est la norme : vous ne pouvez pas créer une feuille de calcul ou un classeur si ce n'est à partir de sa collection parente.
[1] Un autre ajustement concerne la question de savoir si le <code>Construct</code> est un Sub ou une Fonction. Si <code>Construct</code> est appelé par un objet pour remplir ses propres propriétés, il peut être un Sub sans valeur de retour. Cependant, si <code>Construct</code> renvoie à <code>Me</code> après avoir rempli les paramètres, alors les méthodes/fonctions Factory dans les 2 premières réponses pourraient laisser les paramètres à <code>Construct</code> . Par exemple, l'utilisation d'une classe d'usine avec cet ajustement pourrait aller : <code>Set Sue = Factory.NewEmployee.Construct("Sue", "50")</code> donde <code>NewEmployee</code> est une méthode de <code>Factory</code> qui renvoie un nouvel employé vierge, mais <code>Construct</code> est une méthode de <code>Employee</code> qui assigne les paramètres en interne et retourne <code>Me</code> .