2009-01-19 619 views
15

Encontré una forma de extender clases en VBScript, pero ¿hay alguna forma de pasar parámetros o sobrecargar el constructor? Actualmente estoy usando una función Init para inicializar las propiedades, pero me gustaría poder hacer esto cuando creo el objeto.
Esta es mi clase de muestra:Sobrecarga de constructores en 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 

Y lo creo

Set objTest = New Test 

Pero le gustaría hacer algo como esto

Set objTest = New Test(strInitText) 

Es esto posible, o ¿Tiene el objeto para ser creado e inicializado en dos setps?

Respuesta

22

Sólo para alterar ligeramente el método 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") 

Es cómo lo hago. Lamentablemente, no hay sobrecarga.

[editar] Aunque si realmente quería que se podría hacer algo como esto ...

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 

que da a los constructores ...

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

que se puede llamar como:

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)) 

Aunque un poco doloroso.

+2

Es 2011 y busqué en Google para esto y disfruté aprendiéndolo. Me gusta refactorizar el viejo VBScript de la misma forma en que me gusta obtener un viejo 486 en ejecución. No tengo ninguna idea. – Chris

+0

Tienes que ajustar '(Nueva prueba)' entre paréntesis? Simplemente no puede hacer, 'New Test (Array())'? = [ – crush

+0

No puedo probarlo rápidamente pero, por lo que recuerdo, se requieren los paréntesis. No hay constructores de clase, por lo que 'New ClassName (arguments)' no es una sintaxis válida en VBScript. Los paréntesis dejan en claro para el analizador que está aplicando los argumentos al resultado de 'New ClassName'. La aplicación de argumentos a un objeto llama a la función marcada como predeterminada en la definición de la clase. – jammus

2

Tienes que hacerlo en dos pasos. VB Script no admite la sobrecarga, por lo que no puede modificar el constructor predeterminado con nuevos parámetros. Lo mismo va para VB6

6

Puede trabajar alrededor de ella por tener su función init devolver el objeto en sí mismo ...

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

¿Por qué obtengo un error de 'Set o = (Nueva Test) .Init ("hello world") 'pero no para' Set o = New Test: Set o = o.Init ("hello world") 'si hago todo esto en una biblioteca QTP, y pongo' Set o = 'declaraciones en un método? – TheBlastOne

1

Un poco hacker, a ciencia cierta, pero cuando necesito varargs de llamadas, una de mis parámetros de los que paso en forma de matriz, es decir

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)):