
Классы
Классами в Delphi называются специальные типы, которые содержат поля, методы и свойства.
Как и любой другой тип, класс служит лишь образцом для создания конкретных экземпляров реализации, которые называются объектами.
Отличием классов от других типов Delphi является то, что объекты класса всегда распределяются в куче (динамической памяти), поэтому объект-переменная фактически является указателем на динамическую область памяти. Однако в отличие от других указателей, при ссылке на содержимое объекта запрещается использовать символ «^» за именем объекта:
type
TMyClass = class(TObject)
Field: Integer;
...
end;
var
MyClass: TMyClass;
begin
...
MyClass^.Field := 0; // Ошибочное обращение к полю!
MyClass.Field := 0; // Верное обращение к полю
...
end;
Основные понятия объектно-ориентированного программирования
В основе классов (объектов) являющихся ядром объектно-ориентированного подхода в программировании лежат три фундаментальных принципа, которые называются инкапсуляция, наследование и полиморфизм.
Инкапсуляция
Класс представляет собой единство трех сущностей - полей, методов и свойств. Объединение этих сущностей в единое целое называется инкапсуляцией.
Инкапсуляция позволяет во многом изолировать класс от остальных частей программы, сделать его «самодостаточным» для решения конкретной задачи. Поэтому класс всегда несет в себе некоторую функциональность. Именно инкапсуляция обеспечивает возможность обмена готовыми к работе программными заготовками.
Например, класс TForm содержит (инкапсулирует в себе) все необходимое для создания окна Windows-программы, класс ТМеmо представляет собой полнофункциональный многострочный текстовый редактор.
Наследование
Любой класс может быть порожден от другого класса. Для этого при его объявлении указывается имя класса-родителя:
<имя_класса_потомка> = class(<имя_класса_родителя>)
Например, TChildClass = class(TParentClass)
Порожденный класс автоматически наследует поля, методы и свойства своего родителя и может добавлять новые. Это и составляет суть принципа наследования.
Принцип наследования обеспечивает поэтапное создание сложных классов и разработку собственных библиотек классов.
Все классы Delphi порождены от единственного родителя - класса TObject. Этот класс не имеет полей и свойств, но включает в себя методы самого общего назначения, обеспечивающие весь жизненный цикл любых объектов - от создания до уничтожения.
В Delphi нельзя создать класс, который не был бы дочерним для класса TObject. Поэтому объявления:
TaClass = class(TObject)
TaClass = сlаss
имеют один и тот же смысл.
Принцип наследования обеспечивает создание ветвящегося дерева классов, разрастающегося, от класса TObject к его потомкам. При этом каждый потомок дополняет своего родителя новыми возможностями и передает их своим потомкам. Вместе с тем, дочерний класс не может удалить какую-либо сущность родительского класса.
Дочерний класс в Delphi не может иметь два и более родительского класса (такая возможность называется множественным наследованием).
Фрагмент дерева классов Delphi
Класс ТPersistent обогащает возможности своего родителя ТОbject: он «умеет» сохранять данные в файле и получать их из него, в результате это умеют делать и все его потомки. Класс ТСоmроnent в свою очередь, умеет взаимодействовать со средой разработчика и передает это умение своим потомкам. Класс ТСоntrol не только способен работать с файлами и средой разработчика, он еще умеет создавать и обслуживать видимые на экране изображения, а его потомок ТWincontrol может создавать окна Windows-программ и т. д.
Полиморфизм
Полиморфизмом называется свойство классов решать схожие по смыслу задачи разными способами.
Поведенческие свойства класса (его функциональность) определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках класса, можно придавать этим потомкам отсутствующие у родителя специфические свойства.
Для изменения метода необходимо перекрыть его в потомке, то есть объявить одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющие разную алгоритмическую основу и придающие объектам разные свойства. Это и есть полиморфизм объектов.
В Delphi полиморфизм достигается не только описанным выше механизмом наследования и перекрытия методов родителя, но и их виртуализацией, позволяющей родительским методам обращаться к методам своих потомков.