2009-01-19 15 views
15

में ओवरलोड कन्स्ट्रक्टर मुझे वीबीस्क्रिप्ट में कक्षाओं का विस्तार करने का कोई तरीका मिला, लेकिन क्या पैरामीटर में पास करने या कन्स्ट्रक्टर को अधिभारित करने के कोई तरीके हैं? मैं वर्तमान में गुणों को आरंभ करने के लिए एक इनिट फ़ंक्शन का उपयोग कर रहा हूं, लेकिन जब मैं ऑब्जेक्ट बनाता हूं तो ऐसा करने में सक्षम होना चाहता हूं।
यह मेरा नमूना वर्ग है:वीबीस्क्रिप्ट

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) 

की तरह कुछ करना चाहते हैं यह संभव है, या क्या करता है वस्तु है दो सेटों में बनाया और शुरू किया जाना है?

उत्तर

22

बस 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

यह 2011 है और मैं दोनों इसके लिए गुगल हो गए और इसे सीखने में आनंद लिया। मुझे पुरानी वीबीस्क्रिप्ट को वैसे ही रीफैक्टर करना पसंद है जैसा मुझे पुराना 486 चलाना पसंद है। मुझे कोई रास्ता नहीं है। – Chris

+0

आपको '(नया टेस्ट)' कोष्ठक में लपेटना है? आप बस नहीं कर सकते, 'नया टेस्ट (ऐरे()) '? = [ – crush

+0

मैं इसे तुरंत परीक्षण नहीं कर सकता लेकिन जहां तक ​​मुझे याद है कि कोष्ठक की आवश्यकता है। कोई वर्ग कन्स्ट्रक्टर नहीं हैं इसलिए 'नया क्लासनाम (तर्क) 'वीबीस्क्रिप्ट में मान्य वाक्यविन्यास नहीं है। कोष्ठक इसे पार्सर को स्पष्ट करते हैं कि आप 'न्यू क्लासनाम' के परिणाम के लिए तर्क लागू कर रहे हैं। किसी ऑब्जेक्ट पर तर्क लागू करना फ़ंक्शन परिभाषा में डिफ़ॉल्ट रूप से चिह्नित फ़ंक्शन को कॉल करता है। – jammus

2

आपको इसे दो चरणों में करना है। वीबी स्क्रिप्ट ओवरलोडिंग का समर्थन नहीं करता है ताकि आप नए पैरामीटर के साथ डिफ़ॉल्ट कन्स्ट्रक्टर को संशोधित नहीं कर सकें। एक ही VB6

के लिए चला जाता है
6

आप वस्तु ही लौटने अपने 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 
+0

क्यों मैं 'सेट ओ = के लिए त्रुटि क्यों मिलती है की जरूरत है (नया टेस्ट) .इमिट ("हैलो वर्ल्ड") 'लेकिन सेट' ओ = नया टेस्ट: ओ = ओ.इनिट ("हैलो वर्ल्ड") सेट करें, 'अगर मैं इसे क्यूटीपी लाइब्रेरी में करता हूं, और' सेट ओ 'डालता हूं = 'एक विधि में बयान? – TheBlastOne

1

, थोड़ा hackish पक्का है, लेकिन मैं जब 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)): 
संबंधित मुद्दे