2010-04-13 77 views
1

我有这个算法,我想在VB6上实现。如何调用函数名称引用一个字符串值在VB中

Sub Main() 
dim stringVal1 as string, stringVal2 as string 
dim getOne as boolean 

stringVal1 = "FunctOne" 
stringVal2 = "FunctTwo" 

if getOne then 
    'Call Function with function name assigned to stringVal1 ... how to call the function here?** 
else 
    'Call Function with function name assigned to stringVal1 ... how to call the function here?** 
end if 

End Sub 


Function FunctOne() 
    Msgbox "I'm function one" 
End Function 

Function FunctTwo() 
    Msgbox "I'm function two" 
End Function 

这可以在VB6中完成吗?

回答

8

通常,这样的代码模式指向您的软件设计中的错误。

在确实需要这种情况的罕见情况下,CallByName完成此操作。

例子:

Call CallByName(Me, "NameOfFunction", vbMethod, arguments) 
+1

AFAIK是做多态性VB6 – Andrey 2010-04-13 13:25:23

+1

@Andrey的唯一途径:不,你很错误:VB6知道接口(http ://stackoverflow.com/questions/2581087)。此外,VB6支持后期绑定,因此您可以调用多态对象上的方法(但这不再适用于Option Explicit)。 – 2010-04-13 13:27:45

+0

我是错的。仍然我讨厌VB6 :) – Andrey 2010-04-13 13:30:30

0

,如果你提供有关为什么你需要他们的名字的字符串表示调用函数的详细信息,这将有助于。你能不能简单地重写你的代码:

If getOne Then 
    Call FuncOne() 
Else 
    Call FuncTwo() 
End If 
0

一般来说,你不希望实际上基于字符串调度。这很容易出错(因为在运行时你必须确定你的String有你想要的函数名),而且真的没有必要。要做到这一点,你希望能够“传入”你想要使用的方法,那就是使用VB所具有的多态性,并为每个实现使用一个单独的类。

在您使用您的接口类模块,说名为MyInterface

Public Sub DoStuff() 
End Sub 

然后,创建两个类模块,每一个可能实现的接口:

MyClassOne

Implements MyInterface 
Public Sub MyInterface_DoStuff() 
    Msgbox "I'm function one" 
End Sub 

然后,在MyClassTwo,同样的事情,但与你的其他实施:

Implements MyInterface 
Public Sub MyInterface_DoStuff() 
    Msgbox "I'm function two" 
End Sub 

要使用它,你只需要通过在执行您想要使用:

Private Sub UseInterface(WhichThingToUse as MyInterface) 
    WhichThingToUse.DoStuff 
End Sub 

而不是使用一个字符串变量来存储使用哪种方法,你需要自行存储New MyClassOneNew MyClassTwo。你不会显示你的getOne变量是如何设置的,但无论逻辑如何设置,你只需要改变来存储MyInterface的实例,直接使用它即可。

进一步的阅读在MSDN库:

相关问题