2009-12-13 16 views
11

मैंने अभी पाया है कि मेरा कीवर्ड निजी प्रक्रियाओं तक पहुंच नहीं सकता है, भले ही वे अपने स्वयं के वर्ग मॉडल के अंदर हों।वीबीए मी कीवर्ड अपने मॉड्यूल में निजी प्रक्रियाओं का उपयोग क्यों नहीं कर सकता?

Class1 में निम्न कोड डालें:

Private Sub Message() 
    Debug.Print "Some private procedure." 
End Sub 

Public Sub DoSomething() 
    Me.Message 
End Sub 

इस कोड वर्ग का एक उदाहरण को दर्शाता है: "। विधि या डेटा सदस्य नहीं मिला"

Sub TestClass() 
    Dim objClass As New Class1 
    objClass.DoSomething 
End Sub 

Me.Message फेंकता संकलन त्रुटि

यदि मैं Private Sub Message() से Public बदलता हूं तो प्रक्रिया ठीक काम करती है। मैं DoSomething प्रक्रिया से मुझे कीवर्ड भी हटा सकता हूं, लेकिन मैं इस धारणा के तहत था कि मेरे कीवर्ड के पीछे विचार यह सुनिश्चित करना है कि कक्षा 1 के कई उदाहरण ठीक से encapsulated हैं।

निजी होने पर वीबीए मी कीवर्ड एक्सेस प्रक्रियाओं को अपने मॉड्यूल में क्यों नहीं कर सकता? क्या मुझे अपना कीवर्ड छोड़ना और कक्षा में ऐसा कुछ करना सुरक्षित है?

Private Sub Message() 
    Debug.Print "Some private procedure." 
End Sub 

Public Sub DoSomething() 
    Message 
End Sub 

धन्यवाद!

अद्यतन: उचित वाक्यविन्यास पर युक्तियों के लिए धन्यवाद, मेरा कोड काम कर रहा है। मैं अभी भी का स्पष्टीकरण ढूंढ रहा हूं क्यों मैं अपने स्वयं के मॉड्यूल के उदाहरण में निजी प्रक्रियाओं का संदर्भ दे सकता हूं। मुझे कोई अच्छा दस्तावेज नहीं मिला।

उत्तर

5

कोई अनुमान है कि इसे डिजाइन क्यों किया गया था, डिजाइनरों से बात किए बिना शुद्ध supposition होगा। लेकिन मेरा खुद का अनुमान यह है कि Me कीवर्ड उस ऑब्जेक्ट का संदर्भ देता है जिस पर कोड वर्तमान में निष्पादित हो रहा है। मुझे लगता है कि मेरे लिए एक विशेष मामला बनाने के बजाय, उन्हें किसी ऑब्जेक्ट के दायरे के नियमों का पालन करना जारी रखना आसान लगता है। ऑब्जेक्ट कहने के लिए कौन सा है। विधि केवल सार्वजनिक या मित्र तरीकों पर काम कर सकता है। तो मैं, यह वही है जो वर्तमान में निष्पादित वस्तु का एक उदाहरण है। और चूंकि वीबीए/वीबी 6 में साझा विधियां नहीं हैं, इसलिए इससे कोई फर्क नहीं पड़ता कि आप मेरे साथ उपसर्ग करते हैं या नहीं।

लेकिन अगर यह आपको बेहतर महसूस करता है, तो मुझे यह भी अविश्वसनीय रूप से अप्रिय लगता है।

+2

भावना बनाता है जब तक। लगता है जैसे 'मी' एक ऑब्जेक्ट वेरिएबल ('ऑब्जेक्ट के रूप में मुझे मंद करें') के रूप में hypothetically बनाने के लिए shorthand है और उस चर को उस ऑब्जेक्ट पर सेट कर रहा है जिसमें कोड है ('मुझे सेट करें = यह मॉड्यूल'। वह ऑब्जेक्ट वैरिएबल अभी भी मॉड्यूल गुणों और प्रक्रियाओं तक पहुंच जाएगा बाहर से धन्यवाद! धन्यवाद! – Kuyenda

3

आपको अपनी कक्षा के अंदर कॉल करने के लिए Me कीवर्ड की आवश्यकता नहीं है।

+0

तरह काम करता है कुछ छाया :( – mlvljr

0

मुझे यह कक्षा वस्तु उदाहरण है। इसलिए कोई भी इस वर्ग के सार्वजनिक कार्यों या उप-समूह को छोड़कर निजी सबस या फ़ंक्शंस या निजी चरों तक पहुंच नहीं सकता है।

0

COM में, ऑब्जेक्ट इंस्टेंस के प्रकार और ऑब्जेक्ट चर के प्रकारों के बीच एक अंतर है। विशेष रूप से, ऑब्जेक्ट चर के प्रकार इंटरफ़ेस प्रकारों के रूप में व्यवहार करते हैं। प्रत्येक प्रकार कम से कम एक इंटरफ़ेस (स्वयं) लागू करता है, लेकिन प्रकार अन्य इंटरफेस भी लागू कर सकते हैं। नकली विरासत में ऐसी क्षमता का उपयोग किया जाता है।

कुछ चौखटे में, यदि वर्ग Foo एक निजी सदस्य Bar है, तो प्रकार Foo के किसी भी गैर-शून्य चर कुछ वर्ग वस्तु जो कि सदस्य शामिल हैं के लिए एक संदर्भ का आयोजन करेगा। सदस्य किसी भी बाहरी कोड के लिए सुलभ नहीं हो सकता है, लेकिन यह अस्तित्व में होगा, और इस प्रकार Foo के लिए कोड के भीतर कहीं से भी पहुंचा जा सकता है।

क्योंकि COM वर्ग-चर प्रकार दाय वर्ग प्रकार इंटरफेस के बजाय तरह व्यवहार करते हैं, तथापि, वहाँ कोई गारंटी नहीं है कि प्रकार Foo के एक चर एक वस्तु जो Foo के गैर सरकारी सदस्यों के किसी भी है का उल्लेख होगा। जबकि एक कंपाइलर जानता था कि Me हमेशा मौजूदा ऑब्जेक्ट को संदर्भित करेगा, जो वास्तविक प्रकार Foo होगा, तथ्य यह है कि Foo का एक निजी सदस्य Me का उपयोग करने का एकमात्र ऑब्जेक्ट है जिसका मतलब है कि कंपाइलर के लिए कोई वास्तविक कारण नहीं है निजी सदस्यों के डॉट-आधारित dereferencing का समर्थन करने के लिए।

0
Public Function Fight() As String 
'performs a round of attacks i.e. each character from both sides performs an attack 
'returns a scripted version of the outcomes of the round 

'check if buccaneers are all dead 
If mBuccaneers.aliveCount > 0 Then 

    'check if any hostiles are alive 
    If mHostiles.aliveCount > 0 Then 

     'check we have some buccaneers 
     If mBuccaneers.count = 0 Then 
      Fight = "There are no buccaneers. Load or create some buccaneers" 
     Else 
      If mHostiles.count = 0 Then 
       'can't fight 
       Fight = "There are no hostiles to fight. Generate some hostiles" 
      Else 
       mScript = "" 
       Call GroupAttack(mBuccaneers, mHostiles) 
       Call GroupAttack(mHostiles, mBuccaneers) 
       Fight = mScript 
      End If 
     End If 

    Else 'hostiles are all dead 
     Fight = "Hostiles are all dead. Generate a new set of hostiles" 
    End If 

Else 
    Fight = "Buccaneers are all dead :(. Suggest building or loading a new buccaneer group" 
End If 
End Function 

कॉल बयान

Private Sub GroupAttack(attackersGroup As clsGroup, defendersGroup As clsGroup) 
'implements the attack of one group on another 

Dim victimNo As Integer 
Dim randomNumber As Integer 
Dim attacker As clsCharacter 
Dim damage As Integer 
Dim defender As clsCharacter 
Randomize 

For Each attacker In attackersGroup.members 

    'check if attacker is still alive 
    If attacker.health > 0 Then 

     'check if any defenders are still alive because there's no point attacking dead defenders 
     If defendersGroup.aliveCount > 0 Then 

      'do some damage on a defender 
      If defendersGroup.count > 0 Then 
       'choose a random hostile 
       victimNo = Int(((Rnd() * defendersGroup.aliveCount) + 1)) 

       'find an alive victim 
       memberid = 0 
       j = 0 
       Do While j < victimNo 
        memberid = memberid + 1 
        If defendersGroup.members(memberid).health > 0 Then 
         j = j + 1 
        End If 
       Loop 
       'reset our victimno to the live victim 
       victimNo = memberid 

       damage = defendersGroup.character(victimNo).attack(attacker.strength) 

       If damage <> 0 Then 'attacker hit 
        mScript = mScript & attacker.name & " hits " & _ 
        defendersGroup.character(victimNo).name & " for " & damage & " damage" 

        If defendersGroup.character(victimNo).health = 0 Then 
         mScript = mScript & " and kills " & defendersGroup.character(victimNo).name 
        End If 
        mScript = mScript & vbCrLf 

       Else 'attacker missed 
        mScript = mScript & attacker.name & " missed " & defendersGroup.character(victimNo).name & vbCrLf 
       End If 

      End If 

     End If 

    End If 

Next attacker 
End Sub 

तुम सब करने की जरूरत है यही उपयोग करके निजी वर्ग विधि GroupAttack का उपयोग करता है, एक आकर्षण