Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Базовые понятия ООП

Объектно-ориентированное программирование

Динамические массивы

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

Для реализации всего вышеизложенного нам поможет инструкция ReDim. Сначала может быть описан динамический массив, например, так:

Dim имямассива () [As type]

Обратите внимание на то, что указывается имя массива и не обязательно указывается тип элементов, но не указывается количество элементов. В дальнейшем можно уточнить описание этого массива, задав количество элементов. Синтаксис инструкции:

ReDim имямассива (границы) [As type]

Ключевое место в этой инструкции – описание границ изменения индексов. Это описание выглядит следующим образом:

[нижняяграница to] верхняяграница, [нижняяграница to] верхняяграница, …

Для каждого индекса можно задать начальное и конечное значение. Если не задавать начальное, то оно определяется по умолчанию (указано в настройках) либо задается при помощи инструкции Option Base.

Option base 1 'установка нижней границы индексов по умолчанию = 1.

Dim Lower

Dim MyArray(20), TwoDArray(3, 4)

Dim ZeroArray(0 To 5) ' здесь явно указаноа нижняя граница индекса.

Lower = LBound(MyArray) ' функция возвращает значение нижней границы массива =1

Lower = LBound(TwoDArray, 2) ' вернет 1.

Lower = LBound(ZeroArray) ' вернет 0.

Можно переописывать массив неоднократно.

ReDim [Preserve] имямассива (границы) [As type]

Здесь важно, что можно изменять границы индексов. Но самое интересное это то, что можно потребовать сохранить все значения в «старых» элементах (Preserve). При применении слова Preserve можно изменять только последнюю размерность.

ReDim X(10, 10, 10)

...

ReDim Preserve X(10, 10, 15)

Еще один важный момент: память, выделенная под статический массив, то есть массив, количество элементов которого задано в инструкции Dim, освобождается только по завершению процедуры или функции, в которой этот массив описан. Если массив описан на уровне модуля, то память, занятая им, освобождается по закрытию документа. Такая расточительность кажется неприемлемой. Для динамических массивов есть замечательная инструкция Erase, которая освобождает память, занятую массивом.

С точки зрения объектно – ориентированного программирования (ООП) объект – это сущность, обладающая свойствами, то есть поименованными значениями, которые можно прочитать и/или записать, и методами, то есть процедурами и функциями, изменяющими значения свойств и/или имеющими некоторый внешний эффект. Следует отметить, что достаточно часто стирается грань между свойствами и методами. Это объясняется в частности требованием инкапсуляции. Разработчик может хранить некоторое значение или вычислять его при каждом обращении, но для пользователя это незаметно. Не удается скрыть разницу между методом и свойством в том случае, когда требуется передать методу параметры.

Необходимо различать класс, то есть тип объектов и реализацию класса, то есть собственно объект. Описать объект, значит описать класс (тип). Создать объект, значит создать экземпляр заданного типа.

Базовые понятия ООП – инкапсуляция, наследование и полиморфизм.

Инкапсуляция предполагает, что для применения класса объектов достаточно знать его интерфейс (описание внешних свойств и методов), никакие особенности реализации объекта не должны влиять на его использование.

Полиморфизм предполагает, что некоторые одинаковые, с точки зрения пользователя класса объектов, свойства и методы имеют одинаковые имена, хотя могут различаться реализацией.

Между классами объектов могут быть два отношения: is-a "это есть", is-a-part "это есть часть". Наследование – предполагает, что свойства родительских объектов наследуются дочерними объектами, связанными по отношению "это есть". Это свойство очень важно, так как помогает существенно сократить список свойств, определяющих один объект (экземпляр).

В VBA реализовано отношение "это есть часть", наследования почти нет. Мы употребили странное определение "почти", так как, не смотря на заявление о том, что наследование не поддерживается, реально трудно было без него обойтись, поэтому оно есть, например кнопка (класс CommandButton) наследует свойства элемента управления (класса Сontrol). Объектные модели, представленные в справочнике по VBA – модель объектов согласно иерархии "это есть часть".

Обращение к объектам и свойствам обычное (через точку): имя_объекта.имя_свойства.

Спуск по объектной модели – дорогая (по затрачиваемому времени и занимаемой памяти) операция. Есть способ зафиксировать верхнюю часть объекта с помощью конструкции "With … End With" и тем самым избавиться от спуска, то есть ускорить работу программы. Кроме того, этот способ позволяет увеличить наглядность программного кода.

Пример:

Исходный текст:

UserForm1.Controls(i).width = UserForm1.Controls(i).width+20

UserForm1.Controls(i).height = UserForm1.Controls(i).height+10

Лучше написать так:

With UserForm1.Controls(i)

.width =.width+20

.height =.height+10

end with

<== предыдущая лекция | следующая лекция ==>
Программное изменение кода | Расширение объектной модели
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 1162; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.