До сих пор мы определяли классы, включающие в качестве полей только обычные переменные. Не редко, однако, поля класса являются указателями на динамический объект данных, в частности, ссылками на другой класс.
Обратимся к примеру, создадим класс отрезков прямых на плоскости. Очевидно, для описания отрезка достаточно определить две его крайние точки. Наследование в этом случае не пройдет. Отрезок это не “точка и …”, а две точки.
Обратите внимание, TLine не является подклассом TPoint. Два этих класса находятся не в отношении наследования, а в отношении включения, т.е. TLine включает два объекта класса TPoint. Из примера ясно, что свойства тоже могут быть типа класс. Напомним, что FP1 и FP2 являются не объектами типа TPoint, а лишь ссылками на них.
Задумаемся над созданием объектов типа TLine. Достаточно ли написать Line := TLine.Create? Если теперь попытаться определить длину созданного отрезка, возникнет ошибка. Ведь Length, вероятно, выполняет что–то подобное
Length := FP1.Distance(FP2);
где ссылки FP1 и FP2 равны Nil — точки еще не созданы.
Если каким–либо образом удалось создать объекты–точки, то опять, при уничтожении объекта освободится память, выделенная под Line, но память выделенная под объекты FP1 и FP2 будет потеряна. Совершенно аналогичная проблема возникнет и при выделении памяти не под объекты, а любые другие динамические структуры.
Средства ООП, позволяющие избежать подобных затруднений, обсуждаются в следующем параграфе. Здесь же мы еще раз подчеркнем новое явление, классы могут находиться не только в отношении наследования, но и в отношении включения, как TLine включает поля TPoint.
Опубликовал Kest
May 29 2011 21:36:32 ·
0 Комментариев ·
6120 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.