|
Программирование >> Проектирование интерфейса пользователя
5: End Property 6: 7: Public Property Let Names(ByVal Index As Integer, ByVal Name As String) 9 : End Property 10: 11: Public Property Ge s (ByVal Index As Integer) As String 12: 13:End Property 14: 15: Public Property Le s (ByVal Index As Integer, ByVal Str As String) 17:End Property 19:Public Property Get Values(ByVal Name As String) As String 20: 21:End Property 23:Public Property Let Values(ByVal Name As String, ByVal Value As String) 25:End Property 26: 27:Public Su ByVal FileName As String) 29:End Sub 31:Public Sub WriteToFile(ByVal FileName As String) 33:End Sub I В строках 1-33 листинга 22.1 определяется внешний интерфейс класса I strings, поскольку все методы снабжены квалификатором Public. Вы, разумеется, уже обратили внимание, что сами методы еще пе реализованы и класс пе содержит приватных членов. Вся оставшаяся часть работ1 будет выполнена далее. Расширение возможностей существующих классов Удачный способ построения нового класса заключается в расширении функциональных возможностей существующего. Если говорить о классе strings, отметим два аспекта проблемы, требующих решения. Во-первых, нам необходима структура данных для хранения значений и, во-вторых, нужны способы файлового ввода-вывода этих даппых. Если ничего пе помешает, решения непременно будут пайдепы. Использование коллекции для хранения данных ассоциативного массива Класс Collection уже создан, и вполне пригоден для хранения символьной информации. Поэтому его можно рассматривать в качестве подходящей кандидатуры па роль хранилища даппых (строк, содержащих ключевое имя и значение) в классе Strings. Решив использовать класс Collection, следует предложить способы добычи данных из него - в листинге 22.1 уже заготовлены определения соответствующих Property-методов. (Конечно, вместо коллекций можно было бы обратиться к средствам построения массивов, но в последнем случае мы создали бы себе лишние хлопоты - зачем?) Включение объекта существующего класса в состав нового называют агрегацией. Чтобы воспользоваться возможностями коллекций в контексте проектируемого класса, необходимо объявить переменную типа Collection и предусмотреть ее инициализацию, т.е. выполнение операции создания объекта класса Collection. В данном случае переменная типа Collection будет объявлена как приватная. Для ее инициализации и очистки удобно воспользоваться средствамами стандартных обработчиков событий Class Initialize и ciass Terminate. С учетом сказанного, код класса, знакомый по тексту листинга 22.1, нетрудно наполнить новым содержанием. Результат представлен в листинге 22.2. Листинг 22.2. Расширенный вариант кода класса Strings 1: Option Compare Database 2: Option Explicit 3: Option Base 1 4: 5: б: Private FStrings As Collection 7: Public Property Get ames (ByVal Index As Integer) As String On Error GoTo EXGEPT 9: Names = Mid$(Strings(Index), 1, InStr (1, Strings (Index) , = ) - 1) Exit Property EXCEPT: Gall RaiseError(Err.Description) End Property 10 11 12 13 14 : 15 :Public Property Let Names(ByVal Index As Integer, ByVal Name As String) 16 : On Error GoTo EXCEPT 17 : Strings (Index) = Name & = & Values (Names (Index) ) 18 : Exit Property 19 :EXCEPT: 20 : Call RaiseError(Err.Description) 21-End Property 22 23 : Public Property Get Strings ( ) As Collection 24 : Strings = FStrings 25 .End Property 2 6 27 Public Property Get Values(ByVal Name As String) As String 28 : Dim Index As Integer 29 : Index = TndexOfName(Name) 30 : If (Index > -1) Then 31 : Values = Strings(Index) 32 : Values = Right$(Values, Length(Values) - lnStr(l, Values, = ) ) 33 34 35 36 Else Call RaiseError(Name & не найдено ) End If End Property 38:Public Property Le (ByVal Name As String, ByVal Value As String) 39: On Error GoTo EXCEPT 40: FStrings(IndexOfName(Name)) = Name & = & Value 41: Exit Property 42:EXCEPT: 43: Number = 5) Then 44: FStrings.Add(Name & = Value) 45: Else 46: Call RaiseError(Err.Description) 47: End If 48:End Property 49: 50:Public Function IndexOfName(ByVal Name As String) As Integer 51: 52: Dim I As Integer 53: For I = 1 To FStrings.Count 54:. If (InStr( Strings ( I ), Name) > 0) Then 55: IndexOfName = I 56: Exit Function 57: End If 58: Next I 60: IndexOfName = -1 61:End Function 63: Public Su ByVal FileName As String) 65:End Sub 67:Public Sub WriteToFile(ByVal FileName As String) 68: 69:End Sub 70: 71: Private Sub Class Initialize ( ) 72: Set FStrings = New Collection 73:End Sub 74: 75:Private Sub Class Terminate( ) 76: Set FStrings = Nothing 77:End Sub 78: 79: Private Sub RaiseError (ByVal Msg As String) 80: Err. Raise VbObjectError + 1000, Strings . els , Msg 81:End Sub Как вы заметили, объем кода существенно в1рос. Выбрав класс кол-II лекций, мы значительно облегчили задачу программирования. Строка 5 содержит объявление переменной FStrings класса Collection. Объект коллекции инициализируется в момент выполнения директивы New (срабатывает процедура Class Initialize, расположеппая в строкам 73), уничтожается оп при выполнении команды присваивания значения Nothing (автоматически в1полпяется процедура Class Terminate, строки 75-77).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |