0

我想轮询一个类并让它返回所有可用的子类,然后我可以解决它们。它可以返回一个数组、一个字典或其他东西。只要我可以遍历它们的集合并从中读取属性或调用函数。

场景:我想创建一个表单,用户可以在其中输入一系列事件的详细信息。然后我阅读表格并输出报告。每种事件都有一个“.Name”,但有一组不同的输入 (FormOptions) 和方法 (FormatOutput) 来创建输出。现在这是通过一个复杂的表单和一个在用户提交表单后运行的脚本来实现的。

麻烦的是每次我在表单中添加一个选项时,我都必须在几个不同的地方更改代码。为了使我的代码更易于维护,我想将每个事件类型的所有代码包含在一个类中,然后基于可用的类构建表单。

举个例子,我正在从一组会议和旅行对象中构建一个行程:

    Class Itinerary

    Class Event
        Public Property Get Name()
            Name = "Meeting"
        End Property

        Public Function FormOptions(id)
            Form Options = "<div id="& id &">form code for Meeting options</div>"
        End Function

        Public Sub FormatOutput(Time, Title, Location)
            'Make a fancy meeting entry
        End Sub
    End Class

    Class Travel
        Public Property Get Name()
            Name = "Travel"
        End Property

        Public Function FormOptions(id)
            Form Options = "<div id="& id &">form code for Travel options</div>"
        End Function

        Public Sub FormatOutput(StartTime, EndTime, Origin, Destination)
            'Make a fancy travel entry
        End Sub
    End Class
End Class

当脚本运行时,它会创建一个表单,用户可以在其中添加一系列事件。每次用户在“会议”和“旅行”之间进行选择时,都会填写该事件类型的选项。最后,他们按下一个按钮,脚本会生成一个漂亮的文档,列出所有用户的输入。

在未来的某个时候,我会想添加一种新的活动:住宿。

Class Lodging
    Public Property Get Name()
        Name = "Lodging"
    End Property

    Public Function FormOptions(id)
        Form Options = "<div id="& id &">form code for Lodging options</div>"
    End Function

    Public Sub FormatOutput(Date, Location)
        'Make a fancy Lodging entry
    End Sub
End Class

如何设置我的行程类,以便它自动识别新类并将其作为可用事件类型返回?我可以想到几种方法来做到这一点,但它们都涉及将可用类的索引与实际类分开,并且我试图在添加新事件类型时尽量减少必须更改代码的地方的数量。

我故意不包括有关如何构建表单的任何细节,因为此时我对任何事情都持开放态度。此外,请谨慎对待“继承”、“可扩展性”或“多态性”的引用。我只是一个脚本编写者,这些 OOP 概念对我来说仍然有点陌生。

4

1 回答 1

0

我认为这是不可能的,但接近这一点的一种方法是拥有一个唯一的类名列表——最简单的方法是拥有一个全局字典。

您可以通过阅读Keys字典的集合来获取类列表。

我不认为 VBScript 支持对类的引用,因此当用户选择其中一种类型时,可以使用它Eval来创建相应类的实例。

Dim ClassList
Set ClassList = CreateObject("Scripting.Dictionary")

'on type selection:
Function GetItineraryInstance(className)
    Set GetItineraryInstance = Eval("New " & className)
End Function

ClassList("Travel") = 1
Class Travel
    'methods
End Class

至少类注册可以和类定义一起保存。

于 2013-08-28T21:59:25.987 回答