2013-08-28 4 views
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 

Как настроить свой маршрут класс так, чтобы он автоматически распознает новый класс и может вернуть его в качестве доступного типа события? Я могу придумать несколько способов сделать это, но все они включают в себя сохранение индекса доступных классов отдельно от реальных классов, и я пытаюсь свести к минимуму количество мест, которые мне нужно изменить, когда я добавляю новые типы событий.

Я очень намеренно не включаю никаких подробностей о том, как я создаю форму, так как на данный момент я открыт для чего-либо. Кроме того, будьте осторожны со ссылками на «наследование», «расширяемость» или «полиморфизм». Я просто сценарист, и эти концепции ООП по-прежнему немного чужды мне.

ответ

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 

По меньшей мере, регистрация классов может храниться вместе с определением класса.

+0

Это почти работает. Class_Initialize не вызывается до тех пор, пока не будет создан экземпляр класса AFTER. Таким образом, все доступные имена классов должны быть добавлены в словарь вне самих классов. Но это позволяет получить всего два места для редактирования кода (и один просто добавляет элемент словаря). –

+0

@WebbMyers Удалено 'Class_Initialize' –

Смежные вопросы