2009-01-19 20 views
15

Znalazłem sposób na rozszerzenie klas w VBScript, ale czy istnieją sposoby przekazywania parametrów lub przeciążania konstruktora? Obecnie używam funkcji Init, aby zainicjować właściwości, ale chciałbym móc to zrobić podczas tworzenia obiektu.
To moja klasa próbki:Konstruktory przeciążeniowe w 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 

I tworzę to

Set objTest = New Test 

Ale chciałby zrobić coś takiego

Set objTest = New Test(strInitText) 

Czy to możliwe, czy też przedmiot posiada do utworzenia i zainicjowania w dwóch setach?

Odpowiedz

22

Wystarczy lekko zmienić na metodę svinto za ...

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

Czy jak to robię. Niestety nie ma przeciążenia.

[edytuj] Chociaż jeśli naprawdę chciał mógłby zrobić coś takiego ...

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 

co daje konstruktorów ...

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

które można nazwać jako:

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

Trochę bólu.

+2

Jest rok 2011 i zarówno googlowałem, jak i ucząc się. Lubię refaktoryzować stary VBScript w taki sam sposób, w jaki lubię mieć starą wersję 486. Nie mam pojęcia drogi. – Chris

+0

Musisz zawinąć '(New Test)' w nawiasach? Nie możesz po prostu zrobić, 'New Test (Array())'? = [ – crush

+0

Nie mogę tego szybko przetestować, ale o ile pamiętam, wymagane są nawiasy. Nie ma konstruktorów klas, więc 'New ClassName (argumenty)' nie jest prawidłową składnią w VBScript. Nawiasy wyjaśniają parserowi, że stosujesz argumenty do wyniku "New ClassName". Zastosowanie argumentów do obiektu wywołuje funkcję oznaczoną jako domyślną w definicji klasy. – jammus

2

Musisz zrobić to w dwóch etapach. Skrypt VB nie obsługuje przeciążania, więc nie można zmodyfikować domyślnego konstruktora za pomocą nowych parametrów. To samo dotyczy VB6

6

można obejść poprzez swoją funkcję Init powrocie samego obiektu ...

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

Dlaczego otrzymuję błąd dla 'zbioru O = (New Test) .Init ("hello world") 'ale nie dla' Set o = New Test: Set o = o.Init ("hello world") 'jeśli zrobię to wszystko w bibliotece QTP i wstawię' Set o = 'instrukcje do metody? – TheBlastOne

1

Trochę hackish, na pewno, ale kiedy muszę varargs w połączeniach, jeden z moich parametrów mijam w postaci tablicy, tj

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