0

クラスをポーリングし、使用可能なすべてのサブクラスを返して、それらに対処できるようにしたいと考えています。配列、辞書、またはその他のものを返すことができます。それらのセットをループして、プロパティを読み取ったり、それぞれから関数を呼び出したりできる限り。

シナリオ: ユーザーが一連のイベントの詳細を入力するフォームを作成したいと考えています。次に、フォームを読み取り、レポートを出力します。イベントの種類ごとに「.Name」がありますが、出力を作成するための入力 (FormOptions) とメソッド (FormatOutput) のセットが異なります。現在、これは複雑なフォームと、ユーザーがフォームを送信した後に実行されるスクリプトで実装されています。

問題は、フォームにオプションを追加するたびに、いくつかの異なる場所でコードを変更しなければならないことです。コードの保守を容易にするために、各イベント タイプのすべてのコードをクラスに含め、使用可能なクラスに基づいてフォームを作成したいと考えています。

例として、Meeting オブジェクトと Travel オブジェクトのコレクションから旅程を作成しています。

    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

Itinerary クラスが新しいクラスを自動的に認識し、利用可能なイベント タイプとして返​​すように設定するにはどうすればよいですか? これを行う方法はいくつか考えられますが、それらはすべて、使用可能なクラスのインデックスを実際のクラスとは別に保持する必要があり、新しいイベント タイプを追加するときにコードを変更する必要がある場所の数を最小限に抑えようとしています。

この時点で私は何に対してもオープンであるため、フォームの作成方法に関する詳細は意図的に含めていません。また、「継承」、「拡張性」、または「ポリモーフィズム」への言及もおだやかにしてください。私は単なるスクリプターであり、これらの OOP の概念はまだ少しなじみがありません。

4

1 に答える 1

0

これが可能だとは思いませんが、これに近づく方法の 1 つは、クラス名の一意のリストを作成することです。最も簡単なのは、グローバル ディクショナリを作成することです。

Keysディクショナリのコレクションを読み取ることで、クラスの一覧を取得できます。

VBScript がクラスへの参照をサポートしているとは思わないので、ユーザーがタイプの 1 つを選択する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 に答える