Конструкторы перегрузки в VBScript
Я нашел способ расширить классы в 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)
Возможно ли это, или нужно создать и инициализировать объект в двух настройках?
Ответы
Ответ 1
Просто немного измените метод 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))
Немного боль, хотя.
Ответ 2
Вы можете обойти это, указав функцию 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
Ответ 3
Вы должны сделать это за два шага. VB Script не поддерживает перегрузку, поэтому вы не можете изменить конструктор по умолчанию с новыми параметрами. То же самое касается Vb6
Ответ 4
Немного хакерский, конечно, но когда мне нужно 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)):