visual una sobreescritura que objetos objeto net llamar lista instanciar ejemplo como clases clase vbscript class

vbscript - una - que es un objeto en visual basic



Sobrecarga de constructores en VBScript (4)

Encontré una manera 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:

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 me gustaría hacer algo como esto

Set objTest = New Test(strInitText)

¿Es esto posible o el objeto debe ser creado e inicializado en dos setps?


Puede solucionarlo haciendo que su función Init devuelva el objeto en sí ...

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


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 vale para Vb6


Un poco hackish, seguro, pero cuando necesito varargs en llamadas, uno de mis parámetros lo paso como una 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)):


Solo 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 como lo hago Lamentablemente, no hay sobrecarga.

[edit] Aunque si realmente quisieras, podrías 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

Lo que le da a los constructores ...

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

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

Un poco de dolor sin embargo.