2009-01-19 10 views
15

J'ai trouvé un moyen d'étendre les classes dans VBScript, mais existe-t-il des moyens de passer des paramètres ou de surcharger le constructeur? J'utilise actuellement une fonction Init pour initialiser les propriétés, mais j'aimerais pouvoir le faire lorsque je crée l'objet.
Ceci est mon exemple de classe:Constructeurs de surcharge dans VBScript

Class Test 
    Private strText 

    Public Property Get Text 
     Text = strText 
    End Property 

    Public Property Let Text(strIn) 
     strText = strIn 
    End Property 

    Private Sub Class_Initialize() 
     Init 
    End Sub 

    Private Sub Class_Terminate() 

    End Sub 

    Private Function Init 
     strText = "Start Text" 
    End Function  
End Class 

Et je le crée

Set objTest = New Test 

mais je voudrais faire quelque chose comme ça

Set objTest = New Test(strInitText) 

Est-ce possible, ou est-ce l'objet ont être créé et initialisé dans deux setps?

Répondre

22

Juste pour modifier légèrement sur la méthode de svinto ...

Class Test 
    Private m_s 
    Public Default Function Init(s) 
    m_s = s 
    Set Init = Me 
    End Function 
    Public Function Hello() 
    Hello = m_s 
    End Function 
End Class 

Dim o : Set o = (New Test)("hello world") 

Est comment je le fais. Malheureusement, pas de surcharge cependant.

[modifier] Bien que si vous vouliez vraiment vous pourriez faire quelque chose comme ça ...

Class Test 
    Private m_s 
    Private m_i 

    Public Default Function Init(parameters) 
     Select Case UBound(parameters) 
      Case 0 
       Set Init = InitOneParam(parameters(0)) 
      Case 1 
       Set Init = InitTwoParam(parameters(0), parameters(1)) 
      Else Case 
       Set Init = Me 
     End Select 
    End Function 

    Private Function InitOneParam(parameter1) 
     If TypeName(parameter1) = "String" Then 
      m_s = parameter1 
     Else 
      m_i = parameter1 
     End If 
     Set InitOneParam = Me 
    End Function 

    Private Function InitTwoParam(parameter1, parameter2) 
     m_s = parameter1 
     m_i = parameter2 
     Set InitTwoParam = Me 
    End Function 
End Class 

Ce qui donne les constructeurs ...

Test() 
Test(string) 
Test(integer) 
Test(string, integer) 

que vous pouvez appeler comme:

Dim o : Set o = (New Test)(Array()) 
Dim o : Set o = (New Test)(Array("Hello World")) 
Dim o : Set o = (New Test)(Array(1024)) 
Dim o : Set o = (New Test)(Array("Hello World", 1024)) 

Un peu de douleur cependant.

+2

C'est en 2011 et j'ai tous les deux googlé pour cela et j'ai aimé l'apprendre. J'aime refactoriser le vieux VBScript de la même façon que j'aime faire fonctionner un vieux 486. Je n'ai aucune idée – Chris

+0

Vous devez envelopper le '(Nouveau Test)' entre parenthèses? Vous ne pouvez pas simplement faire, 'New Test (Array())'? = [ – crush

+0

Je ne peux pas le tester rapidement mais pour autant que je me souvienne, les parenthèses sont obligatoires. Il n'y a pas de constructeur de classe donc 'New ClassName (arguments)' n'est pas une syntaxe valide dans VBScript. Les parenthèses indiquent clairement à l'analyseur que vous appliquez les arguments au résultat de 'New ClassName'. L'application d'arguments à un objet appelle la fonction marquée par défaut dans la définition de classe. – jammus

2

Vous devez le faire en deux étapes. VB Script ne supporte pas la surcharge, donc vous ne pouvez pas modifier le constructeur par défaut avec de nouveaux paramètres. Même chose pour VB6

6

Vous pouvez contourner le problème en ayant votre fonction Init retour de l'objet lui-même ...

Class Test 
    Private m_s 
    Public Function Init(s) 
    m_s = s 
    Set Init = Me 
    End Function 
    Public Function Hello() 
    Hello = m_s 
    End Function 
End Class 

Dim o 
Set o = (New Test).Init("hello world") 
Echo o.Hello 
+0

Pourquoi ai-je une erreur pour 'Set o = (Nouveau Test) .Init ("hello world") 'mais pas pour' Set o = Nouveau test: Set o = o.Init ("bonjour monde") 'si je fais tout cela dans une bibliothèque QTP, et mettre le' Set o = 'déclarations dans une méthode? – TheBlastOne

1

Un peu hackish, bien sûr, mais quand j'ai besoin VarArgs dans les appels, l'un de mes paramètres je passe comme un tableau, à savoir

Rem printf done poorly 
sub printf(fmt, args) 
    dim fp, vap: 
    dim outs: 
    dim fini: 
     fini = 0: 
     vap = 0: 
    while (not fini) 
    fp = index(fmt,"%"): 
    if (not(isNull(fp))) then 
     ' do something with %f, %s 
     select case(fp) 
     case 'c': 
      outs = outs & charparse(args(vap)): 
     case 's': 
      outs = outs & args(vap): 
     ' and so on. Quite incomplete but you get the idea. 
     end select 
     vap = vap + 1 
    end if 
    wend 
end sub 

printf("%s %d\n",array("Hello World", 42)):