VB6中的多态行为

Tom*_*sky 4 oop vb6 polymorphism

我最近注意到VB6中的CallByName关键字.

由于这需要一个对象,过程名称,"调用类型"和参数数组,这可以用来"伪造"某些类型的多态行为吗?

我可以创建2个类,A类和B类,每个类都使用相同的方法Foo,并执行:

Dim list As New Collection
Dim instanceA As New ClassA
Dim instanceB As New ClassB
Dim current As Object

Call list.Add(instanceA)
Call list.Add(instanceB)

For Each current in list
  Call CallByName(current, "methodName", vbMethod)
Next
Run Code Online (Sandbox Code Playgroud)

有人这样做过吗?问题?可怕的想法或天才的想法?启示?意想不到的后果?

Kon*_*lph 14

为什么假多态?VB6以接口的形式具有真正的多态性:

' Interface1.cls '

Sub Foo()
End Sub

' --------------------------------------------- '

' Class1.cls '
Implements Interface1

Private Sub Interface1_Foo()
    ? "Hello from class 1"
End Sub

' --------------------------------------------- '

' Class2.cls '
Implements Interface1

Private Sub Interface1_Foo()
    ? "Hello from class 2"
End Sub

' --------------------------------------------- '

' Module1.mod '

Dim x As Interface1
Set x = New Class1
Call x.Foo()
Set x = New Class2
Call x.Foo()
Run Code Online (Sandbox Code Playgroud)


Dan*_*att 6

虽然我与麒麟先生同意,我不能不指出的是,CallByName也没有必要(在这种情况下),因为你可以使用标准方法的语法调用该方法,它会导致后期绑定(即未解决在编译时)调用:

...
For Each current In list
    Call current.methodName
Next
Run Code Online (Sandbox Code Playgroud)

CallByName的真正用途是引用方法名称/属性,其中名称来自(可能计算的)字符串值...在我看来绝对可憎.