我最近注意到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
之前有人这样做过吗?问题?可怕的想法或天才的想法?启示?意想不到的后果?
答案 0 :(得分: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()
答案 1 :(得分:6)
虽然我同意unicorn先生,但我不禁要指出CallByName也是不必要的(在这种情况下),因为你可以使用标准方法语法调用该方法,它将导致后期绑定(即在编译时未解决)调用:
...
For Each current In list
Call current.methodName
Next
CallByName的真正用途是引用方法名称/属性,其中名称来自(可能计算的)字符串值...在我看来绝对可憎。
答案 2 :(得分:2)
如果您处于继承了一个没有单一界面的巨大项目的情况下(听起来像你这样做),那么CallByName是一个很好的工具来伪造多态性。我一直都在使用它 - 从来没有任何问题。