2010-08-01 4 views
20

वीबी 6 कक्षा मॉड्यूल में पैरामीटरयुक्त कन्स्ट्रक्टर नहीं हैं। इसके लिए आपने किस समाधान को चुना है? Facory विधियों का उपयोग स्पष्ट पसंद की तरह लगता है, लेकिन मुझे आश्चर्य है!आपने वीबी 6 में रचनाकारों की कमी के साथ कैसे निपटाया है?

+8

रचनाकारों की कमी आईएमओ कहने का एक अच्छा तरीका नहीं है। वीबी 6 * करता है * वास्तव में पैरामीटर रहित रचनाकार ('class_Initialize' विधि) है। इसके पास पैरामीटरयुक्त कन्स्ट्रक्टर नहीं है। –

+0

@ मेहरदाद: बिंदु ले लिया! – Dabblernl

उत्तर

6

मैं आमतौर पर कारखाने के तरीकों, जहां मैं एक ही मॉड्यूल (.BAS विस्तार) में संबंधित वर्गों के लिए "कंस्ट्रक्टर्स" डाल करने के लिए चिपके रहते हैं। अफसोस की बात है, यह इष्टतम से बहुत दूर है क्योंकि आप वास्तव में वीबी 6 में सामान्य ऑब्जेक्ट सृजन तक पहुंच सीमित नहीं कर सकते हैं - आपको केवल कारखाने के माध्यम से अपनी वस्तुओं को बनाने का एक बिंदु बनाना है। वास्तविक वस्तु और आपकी फैक्ट्री विधि के बीच कूदना क्या बुरा है, क्योंकि आईडीई में संगठन स्वयं बोझिल है।

+0

या कक्षा में फ़ैक्टरी विधि जोड़ने के बारे में क्या? मॉड्यूल में फैक्ट्री विधियों को रखना उन्हें एप्लिकेशन विशिष्ट बनाता है। – Dabblernl

+0

@Dabblernl - लेकिन फिर आपको उन्हें जावा के 'सार्वजनिक स्थिर' के बराबर बनाना होगा, है ना? वीबी 6 में स्थिर तरीके नहीं हैं। – derekerdmann

+0

ठीक है, एक स्थिर वर्ग की कोई ज़रूरत नहीं है। आपको फैक्ट्री विधि तक पहुंचने के लिए एक उदाहरण बनाना होगा, लेकिन जैसा कि आप ऑब्जेक्ट की निर्भरताओं का उपयोग नहीं करते हैं जो स्वीकार्य होगा IMHO – Dabblernl

5

उपलब्ध क्लास प्रारंभकर्ता का उपयोग करने के बारे में कैसे? यह एक parameterless निर्माता की तरह बर्ताव:

Private Sub Class_Initialize() 
    ' do initialization here 

End Sub 
+2

तथ्य यह है कि यह किसी भी पैरामीटर को स्वीकार नहीं करता है यह एक निर्माता के रूप में काफी बेकार बनाता है। यह वास्तव में केवल कुछ चीजों को स्थापित करने देता है, लेकिन वास्तव में वस्तु के राज्य को प्रारंभ नहीं करता है। – derekerdmann

+0

क्षमा करें, मेरा सवाल अस्पष्ट था। मेरा मतलब था कि इस समस्या को हल करने के लिए कि केवल एक पैरामीटर रहित कन्स्ट्रक्टर है: Class_Initialize – Dabblernl

4

मैं कारखाने के कार्यों (पैरेंट कक्षाओं में) का मिश्रण उपयोग करता हूं जो तब ऑब्जेक्ट का एक उदाहरण बनाते हैं और एक मित्र को Init() विधि कहते हैं।

कक्षा CObjects:

Public Function Add(ByVal Param1 As String, ByVal Param2 As Long) As CObject 
    Dim Obj As CObject 
    Set Obj = New CObject 
    Obj.Init Param1, Param2 
    Set Add = Obj 
End Function 

कक्षा CObject:

Friend Sub Init(ByVal Param1 As String, ByVal Param2 As Long) 
    If Param1 = "" Then Err.Raise 123, , "Param1 not set" 
    If Param2 < 0 Or Param2 > 15 Then Err.Raise 124, , "Param2 out of range" 

    'Init object state here 
End Sub 

मैं जानता हूँ कि Friend गुंजाइश परियोजना में इसका कोई प्रभाव नहीं होगा, लेकिन यह एक चेतावनी है कि यह आंतरिक के लिए है के रूप में कार्य सिर्फ इस्तमाल करे। यदि इन ऑब्जेक्ट्स को COM के माध्यम से उजागर किया जाता है तो Init विधि को कॉल नहीं किया जा सकता है, और कक्षा को PublicNotCreatablestops it being created पर सेट किया जा सकता है।