Can';t在VB6中实现类

Can';t在VB6中实现类,vb6,Vb6,我试图在VB6中实现一个接口。我已经这样定义了类Cast\u Speed Public Function Run_Time() As Long End Function Option Explicit Implements Cast_Speed Public Function Cast_Speed_Run_Time() As Long Cast_Speed_Run_Time = 0 End Function 像这样的实现 Public Function Run_Time() As

我试图在VB6中实现一个接口。我已经这样定义了类
Cast\u Speed

Public Function Run_Time() As Long

End Function
Option Explicit
Implements Cast_Speed

Public Function Cast_Speed_Run_Time() As Long
    Cast_Speed_Run_Time = 0
End Function
像这样的实现

Public Function Run_Time() As Long

End Function
Option Explicit
Implements Cast_Speed

Public Function Cast_Speed_Run_Time() As Long
    Cast_Speed_Run_Time = 0
End Function

但试图编译它会给出“对象模块需要为接口“Cast\u Speed”实现“运行时”。有人能看出我做错了什么吗?我的子例程似乎很好,但我尝试的所有函数都有这个问题。

除非我弄错了,否则VB6中的接口实现需要是私有的(即使接口声明它们为公共的)

尝试更改:

Public Function Cast_Speed_Run_Time() As Long
致:


您还可以阅读(这似乎支持我)。

它不喜欢方法名称中的下划线字符。尝试改用
RunTime()

我只是在没有下划线的情况下测试了它,它对我来说很好:

'// class Cast_Speed
Option Explicit

Public Function RunTime() As Long

End Function


'// class Class1
Option Explicit

Implements Cast_Speed

Public Function Cast_Speed_RunTime() As Long
  Cast_Speed_RunTime = 0
End Function

虽然您可以公开接口实现,但这并不是一个好的实践,正如您也可以直接实例化接口一样。这只是一个格言的例子,在VB6中编写极坏的代码是可能的

最佳做法如下:

  • 接口实例属性是PublicNotCreatable
  • 实现的接口方法的作用域是私有的
  • 因此:


    等等。如果有人试图直接实例化接口,则会导致错误;如果有人试图直接调用实现的方法,而不是通过接口以多态方式调用实现的方法,则也会返回错误。

    有关此主题的详细概述,请参阅。

    是的,您错了。我刚刚测试过:它默认为
    Private
    ,但手动编辑作用域到
    Public
    效果很好。@Justin Niessner:自己试试我刚刚发布到我答案中的工作代码;)@贾斯汀·尼斯纳:这是香草VBA,所以在Word、Excel等软件中都可以使用,以防你有这样的软件。Excel是我自己使用的工具!:)@贾斯汀@onedaywhen贾斯汀错了,onedaywhen对了。我刚刚用VB6编译了onedaywhen的带有公共函数的代码。VB6文档中还有一个支持onedaywhen的主题,请参见我对该主题的评论answer@onedaywhen当前位置你确实可以照你说的去做,但这并不意味着你应该这样做。关于接口的要点是,它们向公众公开功能,同时隐藏该功能的实现细节。您不希望人们直接调用实现者方法;相反,他们应该调用接口方法并以这种方式访问实现者方法;我从来没有想过要尝试它。VB6文档中的+1创建用于Implements语句的接口
    接口方法的名称中不能有下划线
    -1,因为在接口方法应为私有时使用了PUBLIC关键字。这是可行的,但不是很好的实践,对于在VB中实现多态性来说没有意义。参见BobRode的答案。@onedaywhen:只需将CastSpeed_RunTime()函数设置为私有。这样,就可以通过CastSpeed接口访问它:声明一个CastSpeed类型的变量,然后将该变量实例化为一个新的Class1对象。如您所见,我还避免了Clas名称中的下划线。VB惯例是使用camelCase来代替。@onedaywhen:关键是接口就是这样。接口是一系列操作的定义。它不是操作的实施者;这就是它们被另一个类实现的原因。换句话说,根据定义,接口迫使用户通过自身访问实现类的方法(当然,类既可以实现接口,也可以提供不属于接口的其他方法)。这就是类通过将自己表示为接口的实现者而达成的“契约”。(…)接口是PublicNotCreatable的原因是您不想创建接口的实例。相反,您将变量声明为接口的类型,并实例化接口的实现者。您希望方法的作用域为私有的原因是您不希望能够直接调用它们。