我的Access数据库中有以下类模块BlSecurity
:
Option Compare Database
Option Explicit
Private tiendaRepo As ITiendaRepository
Public Sub Init(ptiendaRepo As ITiendaRepository)
tiendaRepo = ptiendaRepo
End Sub
Public Sub Login(code As String)
If tiendaRepo.CheckIfCodeExists(code) = "" Then
Err.Raise Number:=CustomErrors.CenterCodeNotExisting
End If
Exit Sub
End Sub
Private Sub Class_Terminate()
Set tiendaRepo = Nothing
End Sub
这是TiendaRepository代码:
Option Compare Database
Option Explicit
Implements ITiendaRepository
Public Function ITiendaRepository_CheckIfCodeExists(ByVal code As String) As String
Err.Raise vbObjectError, "CheckCode", "Not implemented"
Exit Function
End Function
这是"界面" ITiendaRepository我正在实施:
Option Compare Database
Option Explicit
Public Function CheckIfCodeExists(ByVal code As String) As String
End Function
然后,在按钮处理程序中:
Private Sub btnLogin_Click()
Dim bl As blSecurity
Set bl = New blSecurity
bl.Init (New TiendaRepository)
bl.Login (txtUsuario.Value)
End Sub
但是当我点击按钮时,我会收到消息:
对象不支持此属性或方法
在bl.Init (New TiendaRepository)
行
。它有什么问题?
答案 0 :(得分:2)
也许
1)设置关键字
的注意事项2)删除呼叫中的()
3)BlSecurity还必须实现ITiendaRepository_CheckIfCodeExists
BlSecurity
Option Compare Database
Option Explicit
Implements iTiendaRepository
Private tiendaRepo As iTiendaRepository
Public Sub Init(ptiendaRepo As iTiendaRepository)
Set tiendaRepo = ptiendaRepo '*1
End Sub
Public Sub Login(code As String)
If tiendaRepo.CheckIfCodeExists(code) = "" Then
Err.Raise Number:=CustomErrors.CenterCodeNotExisting
End If
Exit Sub
End Sub
Private Sub Class_Terminate()
Set tiendaRepo = Nothing
End Sub
Public Function ITiendaRepository_CheckIfCodeExists(ByVal code As String) As String '*3
Err.Raise vbObjectError, "CheckCode", "Not implemented"
Exit Function
End Function
模块
Option Compare Database
Option Explicit
Private Sub btnLogin_Click()
Dim bl As BlSecurity
Set bl = New BlSecurity
bl.Init New TiendaRepository '*2
bl.Login txtUsuario.Value '<=== Not sure where declare and should remove ()
End Sub
虽然我不确定你在哪里声明了txtUsuario
答案 1 :(得分:2)
它在我的测试系统上运行(即,引发“未实现”消息)并进行以下两项更改:
在按钮单击模块中,删除New TiendaRepository
周围的括号。
Private Sub btnLogin_Click()
Dim bl As BlSecurity
Set bl = New BlSecurity
bl.Init New TiendaRepository ' <=== here
bl.Login txtUsuario.Value
End Sub
这是因为VBA在调用子例程时不使用括号而不是收集返回值。如果添加括号they actually cause evaluation of the default property。因此,不是将New TiendaRepository
对象传递给bl.Init
,而是传递VBA认为默认值的任何内容。
请注意,VBA编辑器会在代码中的左括号前放置一个空格。这是一个直观的线索,它没有做出你可能期望的语言总是在电话中使用parens。
在BlSecurity.Init
中,添加Set
:
Public Sub Init(ptiendaRepo As ITiendaRepository)
Set tiendaRepo = ptiendaRepo
End Sub
这是因为在分配对象时(在内部,对象的引用),你总是(据我所知)需要Set
。
如果要在VBA中使用方法调用(而不是函数调用)附近的括号,请使用Call
关键字。也就是说,
Call bl.Init(New TiendaRepository)
与
相同bl.Init New TiendaRepository
无论参数数量多少都是如此 - Call foo(a,b,c)
与foo a, b, c
相同。