Я нашел способ расширить классы в VBScript, но есть ли способы передать параметры или перегрузить конструктор? В настоящее время я использую функцию Init для инициализации свойств, но хотел бы иметь возможность сделать это при создании объекта. Это мой образец класса:
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
И я создаю это
Set objTest = New Test
Но хотелось бы сделать что-то подобное
Set objTest = New Test(strInitText)
Возможно ли это, или объект нужно создавать и инициализировать за два набора параметров?





Вы должны сделать это в два этапа. VB Script не поддерживает перегрузку, поэтому вы не можете изменить конструктор по умолчанию с новыми параметрами. То же самое и с Vb6
Вы можете обойти это, если ваша функция Init возвращает сам объект ...
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
Просто немного переделать метод 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")
Как я это делаю. К сожалению, перегрузки нет.
[редактировать] Хотя, если бы очень захотелось, можно было бы сделать что-нибудь вроде этого ...
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
Что дает конструкторам ...
Test()
Test(string)
Test(integer)
Test(string, integer)
который можно назвать:
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))
Хотя немного больно.
Сейчас 2011 год, и я искал это в Google, и мне понравилось это изучать. Мне нравится рефакторинг старого VBScript так же, как мне нравится запускать старый 486. Я понятия не имею, как это сделать.
Вы должны заключить (New Test) в круглые скобки? Вы не можете просто сделать, New Test(Array())? знак равно
Быстро протестировать не могу, но, насколько я помню, круглые скобки обязательны. Конструкторы классов отсутствуют, поэтому синтаксис New ClassName(arguments) недопустим в VBScript. Скобки дают понять синтаксическому анализатору, что вы применяете аргументы к результату New ClassName. Применение аргументов к объекту вызывает функцию, помеченную как значение по умолчанию в определении класса.
Потрясающие. Есть несколько незначительных ошибок: отсутствует 'set' во внутренних функциях, конечная функция вместо конечной общедоступной и конечный выбор вместо конечного регистра.
Скобки не требуются при явном вызове Init (например, Set o = New Test.Init("hello world"). К сожалению, для трюка с функцией по умолчанию это не работает, поэтому да - в этом случае скобки необходимы.
Конечно, немного хакерский, но когда мне нужны varargs в вызовах, один из моих параметров я передаю как массив, т.е.
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)):
Почему я получаю сообщение об ошибке для
Set o = (New Test).Init("hello world"), но не дляSet o = New Test : Set o=o.Init("hello world"), если я делаю все это в библиотеке QTP и помещаю операторыSet o=в метод?