Конструкторы перегрузки в VBScript - PullRequest
15 голосов
/ 19 января 2009

Я нашел способ расширить классы в 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)

Возможно ли это, или объект должен быть создан и инициализирован в два этапа?

Ответы [ 4 ]

22 голосов
/ 15 мая 2009

Просто немного изменить метод Свинто ...

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

Хотя немного боли.

6 голосов
/ 19 января 2009

Вы можете обойти это, если ваша функция 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
2 голосов
/ 19 января 2009

Вы должны сделать это в два этапа. VB Script не поддерживает перегрузку, поэтому вы не можете изменить конструктор по умолчанию новыми параметрами. То же самое касается Vb6

1 голос
/ 12 января 2011

Немного хакерский, конечно, но когда мне нужны переменные в вызовах, один из моих параметров я передаю в виде массива, т.е.

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)):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...