Бояться не надо



Статьи о Delphi

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

   Большим шагом вперёд в развитии технологий программирования было появление объектно-ориентированного программирования. Здесь программный код перестал быть "плоским" и программист оперирует не просто процедурами и функциями, а целыми объектами.

   Объект — совокупность свойств, методов, событий. Что означает "совокупность"? Это значит, что объект как бы состоит из методов, свойств и событий, и они обеспечивают его полноценную работу. Представим себе кнопку. Она обладает:
  • свойствами (цвет, текст на кнопке, шрифт текста и т. д.);
  • событиями (события пользовательского ввода, например, нажатие на кнопку);
  • методами (обеспечивающими работу кнопки, например, метод прорисовки текста, прорисовки фокуса и т. д.).
   Если все это объединить, то получается автономный объект, который может работать в различных условиях. В этом случае достаточно только установить кнопку на форме, и она уже готова к применению. Как же оформляются свойства, методы и события объекта в программах?

   Свойства — это переменные, которые влияют на состояние объекта. Например, ширина и высота объекта.

   Методы — это те же процедуры и функции, т. е. это то, что объект умеет делать. Например, объект может иметь процедуру для вывода какого-то текста на экран. Эта процедура и есть метод, который принадлежит объекту.

   События — это те же процедуры и функции, которые вызываются при наступлении определенного события. Например, если изменилось какое-то свойство объекта, может быть сгенерировано соответствующее событие и вызвана процедура, которая инициализирует реакцию приложения на это событие.

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

   Рассмотрим пример. Пусть пользователь нажал на кнопку. В этом случае она, как объект, генерирует соответствующее событие. В результате этого может быть вызвана процедура-обработчик, которую вы назначили кнопке при возникновении данного события. В этом случае не требуется никакая дополнительная информация, поэтому объект не будет пересылать вам никаких параметров, кроме указателя на самого себя. Однако, если нужно обработать событие, связанное с перемещением курсора мыши, дело будет обстоять несколько иначе. В этом случае объект будет генерировать событие и автоматически передавать вам новые координаты X и Y курсора, поэтому процедура должна быть объявлена с соответствующими параметрами, чтобы можно было принять их от объекта.

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

1. Свойства:
  • левая позиция Left;
  • верхняя позиция Top;
  • ширина Width;
  • высота Height;
  • заголовок Caption;
2. Методы:
  • создать кнопку;
  • нарисовать кнопку;
  • уничтожить кнопку.
3. События:
  • кнопка нажата;
  • кнопка отпущена;
  • заголовок кнопки изменен.
   Объект работает как единое целое. Например, вы изменили заголовок кнопки. Объект генерирует событие "заголовок кнопки изменен". По этому событию вызывается метод "нарисовать кнопку". Этот метод рисует кнопку в позиции, указанной в свойствах объекта, и выводит на кнопке новый текст, указанный в свойстве "заголовок".

   У каждого объекта обязательно присутствуют два метода: "создать объект" и "уничтожить объект". Во время создания объекта происходит выделение памяти дляхранения необходимых свойств, и заполняются значения по умолчанию. Во время уничтожения объекта происходит освобождение выделенной памяти. Метод для создания объекта называется конструктором (constructor). Метод для уничтожения объекта называется деструктором (destructor). Сам процесс создания объекта называется инициализацией.

   Теперь рассмотрим использования нашей кнопки. Он выглядит следующим образом:
  1. Создание кнопки с помощью вызова конструктора;
  2. Изменение необходимых свойств;
  3. Все. Наша кнопка готова к работе.
   Объект — сложный тип данных. Это значит, что вы можете объявлять переменные типа "объект" (точно так же, как объявлялись переменные типа "число" или "строка") и обращаться к объекту через эту переменную. На языке программирования это будет выглядеть немного сложнее:
  1. Объявить переменную типа "кнопка".
  2. В эту переменную проинициализировать объект.
  3. Изменить нужные свойства.
  4. Можно использовать объект.
   Вот тут нужно собрать все, что вы поняли об объектах, в одно целое. Итак, мы можем объявлять переменные типа "объект". Давайте объявим переменную-объект типа Кнопка. Теперь можно создать кнопку, для чего есть конструктор (метод для создания объекта), который выделяет свободную память под этот объект. Процесс инициализации объекта-кнопки выглядит так: переменной Объект нужно присвоить результат работы конструктора объекта Кнопка. Конструктор выделит необходимую объекту память и присвоит свойствам значения по умолчанию. Результат этого действия будет присвоен переменной Объект. Эта переменная будет указывать на область памяти в которой находится созданная кнопка, и ее свойства. После всех этих действий мы можем получить доступ к созданному объекту через переменную Объект.

   Давайте напишем прототип небольшой программы, которая пояснит весь процесс создания объекта.

Начало программы

Переменные:
  Объект1: Кнопка;
Начало кода
  Объект1:= Кнопка.Создать объект;
  Объект1.Заголовок:='Привет';
  Объект1.Уничтожить объект.
Конец кода;


Доступ к свойствам и методам объектов осуществляется при помощи записи

   ИмяОбъекта.Свойство
         или
   ИмяОбъекта.Метод


т.е. в записи имя объекта и его свойства или методы объекта разделяются точкой.

   Создание объекта перед использованием — обязательно. Поэтому, если вы попробуете использовать код, приведенный ниже, то у вас произойдет ошибка.

Неправильное использование объекта

Начало программы
Переменные:
  Объект1: Кнопка;
Начало кода
  Объект1.Заголовок:='Привет';
Конец кода;


   Здесь мы пытаемся изменить заголовок без создания и уничтожения объекта, а это ошибка! В данном случае переменная Объект1 ещё ничего не хранит и ни на что не указывает. Её необходимо сначала проинициализировать и создать для нее объект-кнопку или присвоить адрес расположения в памяти уже существующей кнопки.

   Без инициализации можно использовать только простые переменные, такие как число или строка. Тут Delphi выделяет под них память автоматически, потому что размер этих переменных фиксированный и Delphi уже на этапе компиляции знает, сколько памяти нужно отвести под переменную. Сложные переменные типа объектов обязательно должны инициализироваться. Это связано еще и с размещением данных. Простые переменные хранятся в стеке (сегмент стека), а сложные переменные типа объектов хранятся в памяти компьютера. При старте программы сегмент стека инициализируется автоматически. Поэтому переменные могут спокойно размещаться в уже подготовленной памяти сегмента стека. Когда вы создаете объект, он создается в нераспределенной памяти компьютера. Так как память еще не распределена, ее нужно сначала подготовить (выделить нужный объем под создаваемый объект). После того как объект не нужен, эту память необходимо освободить, вызвав деструктор объекта. Простые переменные освобождать не надо, потому что стек очищается автоматически.

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

Объект в виде шаблона

Начало программы
Переменные:
  Объект1 — Кнопка;
  Объект2 — Кнопка;
Начало кода
  Объект1:= Кнопка.Создать объект;
  Объект2:= Кнопка.Создать объект;
  Объект1.Заголовок:='Привет';
  Объект2.Заголовок:='Пока';
  Объект1.Уничтожить объект;
  Объект2.Уничтожить объект;
Конец кода;


   Инициализацию объекта еще очень часто называют созданием экземпляра объекта. И это тоже правильно. Когда вы вызываете конструктор, в памяти создается новый экземпляр объекта. В данном примере можно сказать, что наши переменные объект1 и Объект2 указывают на собственные экземпляры объекта Кнопка, т. е. в памяти получается две независимые копии объекта (кнопки). Любую из них можно независимо менять и она не будет влиять на другую переменную.

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



По материалам сайта О Delphi


В начало