2010-04-05 5 views
4

J'ai récemment remarqué le mot-clé CallByName dans VB6.Comportement polymorphique dans VB6

Puisque cela prend un objet, un nom de procédure, un "type d'appel" et un tableau d'arguments, cela peut-il être utilisé pour "simuler" certains types de comportement polymorphique?

Je peux faire 2 classes, classe A et B, chacun avec la même méthode Foo, et faire:

Dim list As New Collection 
Dim instanceA As New ClassA 
Dim instanceB As New ClassB 
Dim current As Object 

Call list.Add(instanceA) 
Call list.Add(instanceB) 

For Each current in list 
    Call CallByName(current, "methodName", vbMethod) 
Next 

Tout le monde fait ça avant? Problèmes? Horrible idée ou idée de génie? Implications? Conséquences inattendues?

Répondre

14

Pourquoi un faux polymorphisme? VB6 a polymorphisme réel sous la forme d'interfaces:

' Interface1.cls ' 

Sub Foo() 
End Sub 

' --------------------------------------------- ' 

' Class1.cls ' 
Implements Interface1 

Private Sub Interface1_Foo() 
    ? "Hello from class 1" 
End Sub 

' --------------------------------------------- ' 

' Class2.cls ' 
Implements Interface1 

Private Sub Interface1_Foo() 
    ? "Hello from class 2" 
End Sub 

' --------------------------------------------- ' 

' Module1.mod ' 

Dim x As Interface1 
Set x = New Class1 
Call x.Foo() 
Set x = New Class2 
Call x.Foo() 
+0

Que je ne savais pas. Avoir un projet existant sur lequel travailler, et pas une seule interface dedans ... n'avait aucune idée qu'ils existaient même dans cette langue. Merci! –

6

Bien que je suis d'accord avec M. licorne, je ne peux pas me empêcher de souligner que CallByName est également inutile (dans ce cas) parce que vous pouvez appeler la méthode à l'aide la syntaxe de méthode standard et il se traduira par une liaison tardive (non résolue à la compilation) appel:

... 
For Each current In list 
    Call current.methodName 
Next 

l'utilisation réelle de CallByName est de référencer les noms des méthodes/propriétés où le nom provient d'un (éventuellement calculé) valeur de chaîne ... une abomination absolue, à mon avis.

+0

Semble également un bon moyen de créer une sorte de vulnérabilité d'injection VB dans votre code si la chaîne utilisée pour CallByName n'est pas validée correctement. – JohnFx

2

Si vous êtes dans une situation où vous avez hérité d'un énorme projet sans une seule interface (cela semble être le cas), CallByName est un outil génial pour simuler le polymorphisme. Je l'utilise tout le temps - je n'ai jamais eu aucun problème.

+0

Je suis juste curieux - pourquoi ne pas utiliser la liaison tardive à la place? – MarkJ

+0

@MarkJ. Plus lent et plus de code. – AngryHacker

Questions connexes