我最近注意到了VB6中的CallByName关键字。
因为这需要一个对象,过程名,“调用类型”和参数数组,这能被用来“伪造”某些类型的多态行为吗?
我可以创建两个类,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以前有人这么做过吗?有问题吗?可怕的想法还是天才的想法?暗示?意外的后果?
发布于 2010-04-06 04:58:01
为什么是假的多态性?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()发布于 2010-04-06 05:04:36
虽然我同意unicorn先生的观点,但我不禁要指出,CallByName也是不必要的(在这种情况下),因为您可以使用标准方法语法调用该方法,它将导致后期绑定(即在编译时未解析)调用:
...
For Each current In list
Call current.methodName
Next在我看来,CallByName的真正用途是引用方法名称/属性,其中名称来自(可能是经过计算的)字符串value...an绝对令人厌恶。
发布于 2010-04-07 01:36:20
如果您所处的情况是,您继承了一个没有任何接口的大型项目(听起来像是这样),那么CallByName是一个伪造多态的很棒的工具。我一直在使用它--从来没有遇到过任何问题。
https://stackoverflow.com/questions/2581087
复制相似问题