2016-05-03 2 views
1

У меня есть рекурсивная функция в VB6, и я хочу, чтобы функция была функцией друга, поэтому я не могу ее охватить повсюду, но она не работает. Он будет говорить только, что объект не существует, если я изменю функцию на публичную функцию, она будет работать. Зачем? Я неправильно понял, как работает функция друга или?Почему моя функция рекурсивного друга не работает в VB6?

код выглядит следующим образом:

Friend Function TestFunction() As Boolean 
On Error GoTo ErrHandler 

    TestFunction= False 

    If Me.Works Then 
    TestFunction= True 
    End If 

    If TestFunction = False And Me.HaveChild = True Then 
    Dim objClass 
    For Each objClass In Me.colChild 
     If objClass.TestFunction = True Then 'I get the break here, due to missing object 
     TestFunction = True 
     Exit For 
     End If 
    Next 
    End If 

    Exit Function 

ErrHandler: 
    Call LogError() 
End Function 

Если я просто изменить функцию на публике он будет работать, кто-то может объяснить, почему?

+0

Что такое colChild? Набор объектов типа, в котором определена TestFunction? – djv

+0

Да, это коллекция объекта класса. –

ответ

4

Рекурсия не ограничивается. Вот минимальный пример, который показывает такое же поведение без рекурсии.

Option Explicit 

Private Sub Form_Load() 
    Dim objClass 
    Set objClass = Me 
    ' OK 
    objClass.TestPublicFunction 
    ' Run-time error '438': Object doesn't support this property or method 
    objClass.TestFriendFunction 
    End 
End Sub 

Public Sub TestPublicFunction() 
    MsgBox "In public!" 
End Sub 

Friend Sub TestFriendFunction() 
    MsgBox "In friend!" 
End Sub 

Причина заключается в том, что Друг свойства и методы не могут быть вызваны на объекты, которые являются поздней привязкой, даже в пределах одного проекта. См this MSDN article:

Важно Поскольку члены Дружить не являются частью интерфейса общественного объекта, они не могут быть доступны поздно связаны - то есть, через переменные, объявленные As Object. Чтобы использовать членов Друга, вы должны объявить переменные с ранним связыванием - то есть As classname.

Итак, вы должны иметь возможность исправить свой код, объявив свой для каждого итератора цикла явно, вместо неявного использования Variant.

Dim objClass As ClassName 
For Each objClass In Me.colChild 
+1

На самом деле он использует неявно созданный «Вариант», а не «Объект», но есть небольшая разница, помимо дополнительных накладных расходов. – Bob77

+0

Правильно, я слишком долго был в .net. Исправлена. – djv

Смежные вопросы