Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 1....doc
Скачиваний:
73
Добавлен:
17.12.2018
Размер:
1.88 Mб
Скачать

Семейство классов и реализация интерфейсов

В предыдущей лекции мы уже говорили об одной из важных новинок Office 2000, направленной на превращение VBA в полноценный объектно-ориентированный язык. Возможность создания событий для классов, определенных программистом, существенно расширяет их возможности. Теперь такие классы обладают всеми тремя компонентами, присущими "настоящим" классам, - свойствами, методами и событиями, теперь и их объекты могут индивидуально реагировать на происходящие события. Сейчас мы расскажем еще об одном важном нововведении - возможности реализовать в одном классе интерфейс другого класса. Эта новинка направлена на создание полноценного семейства классов, связанного наследованием интерфейсов и реализующего полиморфизм методов семейства классов. Нужно сразу сказать, что сделано только пол шага в нужном направлении, - можно говорить о реализации полиморфизма и частичной реализации наследования в его классическом понимании. Можно ожидать развития этого направления в последующих версиях Office 2000. Но и то, что уже сделано, представляет несомненный интерес. Понимание этого материала требует от читателя знания основ ООП, и, в первую очередь, понимание наследования и полиморфизма. Минимально необходимые сведения мы сейчас приведем.

Наследование

Объектно-ориентированное программирование дает возможность не только определить класс, задающий состояние и поведение объектов, но и организовать семейство классов с помощью важного отношения между классами, называемого отношением наследования.

Суть наследования в том, что новый класс в момент его создания можно объявить наследником одного или нескольких базовых классов. Пусть уже определен класс A, и при определении новый класс В объявлен наследником класса А. В этом случае класс В наследует все открытые для потомков свойства и поведение класса А, - наследует его интерфейс. Это означает, что в классе В автоматически определены переменные и методы класса А, задающие интерфейс.

Класс А называется базовым (родительским) по отношению к производному (порожденному) классу В. Очень часто, говоря о наследовании, используют терминологию "родительский класс" и "класс-потомок". Ввиду транзитивности наследования (транзитивность означает, что из утверждений "А родитель В" и "В родитель С" следует "А родитель С") каждый класс может иметь множество родителей (предков) и множество потомков, среди которых выделяют "непосредственных родителей" и "непосредственных потомков". Потомок транзитивно наследует свойства и поведение всех своих предков.

В производном классе можно определить новые свойства и новое поведение, задав новые переменные и новые методы. Более того, в производном классе можно переопределить существующий метод базового класса.

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

Отношение наследования обычно представляют в виде графа, узлы которого соответствуют классам, и из узла A в узел B ведет дуга, если класс B является непосредственным наследником класса A. Этот граф изображает структуру совокупности классов с точки зрения наследования. Если наследование не множественное, то соответствующий граф является деревом. В корне дерева находится прародитель - класс, для которого все остальные классы являются его потомками-наследниками.

Вот пример семейства классов, связанных отношением наследования:

Рис. 5.1.  Дерево одиночного наследования

Множественное наследование описывается ациклическим графом:

Рис. 5.2.  Ациклический граф множественного наследования.

Мы уже говорили, что производный класс наследует состояние и поведение базового класса. Это значит, что все открытые (Public) элементы базового класса доступны в производном классе. Но главное, конечно, в том, что потомок может пойти дальше своего родителя. Производный класс расширяет свойства и поведение базового класса. В производном классе можно:

  • объявить новые переменные

  • объявить новые методы

  • переопределить (перегрузить, перекрыть) методы базового класса.

Переопределение метода класса A в производном классе В, называемое также перегрузкой (overloading) или перекрытием (overriding), - это определение в классе B метода с именем, которое уже является именем некоторого метода класса А.

Обычно переопределение осуществляется для того, чтобы привести в соответствие поведение объектов класса их изменившемуся состоянию. Например, метод Analysis, определенный в базовом классе и переопределенный в производном классе, может иметь различное число параметров и отличаться своим поведением. С содержательной точки зрения анализ, выполняемый в производном классе, может быть более подробным.