为什么我的递归友元函数不能在VB6中工作?

为什么我的递归友元函数不能在VB6中工作?,vb6,friend-function,Vb6,Friend Function,我在VB6中有一个递归函数,我希望该函数是一个朋友函数,因此我无法从任何地方访问它,但它不起作用。它只会说对象不存在,如果我将函数更改为公共函数,它将工作。为什么?我是否误解了friend函数的工作原理 代码如下所示: Friend Function TestFunction() As Boolean On Error GoTo ErrHandler TestFunction= False If Me.Works Then TestFunction= True End I

我在VB6中有一个递归函数,我希望该函数是一个朋友函数,因此我无法从任何地方访问它,但它不起作用。它只会说对象不存在,如果我将函数更改为公共函数,它将工作。为什么?我是否误解了friend函数的工作原理

代码如下所示:

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

如果我只是将函数更改为公共函数,它会工作,有人能解释一下原因吗?

它不仅限于递归。下面是一个最小的示例,它显示了没有递归的相同行为

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
原因是不能对后期绑定的对象调用友元属性和方法,即使在同一个项目中也是如此。见:

重要因为朋友成员不是对象的公共对象的一部分 接口,它们不能被后期绑定访问-也就是说,通过 声明为对象的变量。若要使用好友成员,必须声明 具有早期绑定的变量-即,作为类名

因此,实际上,您应该能够通过显式声明for-each循环迭代器来修复代码,而不是隐式使用变量

Dim objClass As ClassName
For Each objClass In Me.colChild 

它不仅限于递归。下面是一个最小的示例,它显示了没有递归的相同行为

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
原因是不能对后期绑定的对象调用友元属性和方法,即使在同一个项目中也是如此。见:

重要,因为好友成员不是对象的公共成员 接口,它们不能被后期绑定访问-也就是说,通过 声明为对象的变量。若要使用好友成员,必须声明 具有早期绑定的变量-即,作为类名

因此,实际上,您应该能够通过显式声明for-each循环迭代器来修复代码,而不是隐式使用变量

Dim objClass As ClassName
For Each objClass In Me.colChild 

什么是colChild?定义TestFunction类型的对象集合?是的,它是类对象的集合。什么是colChild?定义TestFunction类型的对象集合?是的,它是类对象的集合。实际上,他使用的是隐式创建的
变量
,而不是
对象
——但是除了额外的开销之外,没有什么区别。是的,我在.net中呆的时间太长了。修正了。实际上他在那里使用了一个隐式创建的
变量,而不是
对象
——但是除了额外的开销之外,没有什么区别。对了,我在.net中呆的时间太长了。固定的。