Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции delphi 1часть

.pdf
Скачиваний:
64
Добавлен:
16.03.2015
Размер:
814.86 Кб
Скачать

1.ВВЕДЕНИЕ В ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

Объектно-ориентированное программирование (ООП) – это подход к программированию, который включает лучшие идеи, воплощённые как в структурном,

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

Тесно связанным с понятием объекта является понятие класса. Классом называется структура языка, которая может иметь в своем составе данные, функции и процедуры.

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

Необходимо чётко различать понятия класса и объекта: класс — это описание, объект - то,

что создано в соответствии с этим описанием (экземпляр класса). Класс существует в исходном коде программы. Объект существует в памяти ЭВМ во время выполнения.

Соответствующий классу тип будем называть объектным типом:

type

TMyObject = class(TObject)

MyField: Integer;

function MyMethod: Integer; end;

В этом примере описан класс TMyObject, содержащий поле MyFieid и метод

MyMethod.

Поля объекта аналогичны полям записи. Это данные, уникальные для каждого созданного в программе экземпляра класса. Описанный здесь класс TMyObject имеет одно поле — MyFieid. Поля предназначены для хранения данных во время работы экземпляра класса (объекта). Обычно поля используются для обеспечения выполнения операций внутри класса; непосредственный доступ к ним извне закрыт. Однако класс должен каким-либо образом взаимодействовать с другими классами или программными элементами приложения. Для получения и передачи данных в классе применяются

свойства.

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

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

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

Приложение, построенное по принципам ООП, - это не некий жесткий алгоритм,

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

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

Написание этих обработчиков, определяющих логику работы приложения, - основная работа программиста.

Таким образом, можно окончательно определить объект как совокупность полей,

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

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

AMyObject := TMyObject.Create;

{ действия с созданным объектом }

…………….

AMyObject.Destroy;

В языке Object Pascal экземпляры объектов могут быть только динамическими. Это означает, что в приведенном выше фрагменте переменная AMyObject на самом деле является указателем, содержащим адрес объекта.

Включать объекты в свою программу можно двумя способами: вручную включать в нее соответствующие операторы (это приходится делать не очень часто) или путем визуального программирования, используя заготовки - компоненты. Интегрированная среда разработки (Integrated development environment - IDE) Delphi включает в себя большой набор визуальных инструментов для скоростной разработки приложений,

поддерживающей разработку пользовательского интерфейса и подключение к корпоративным базам данных. Библиотека визуальных компонент VCL (Visual Component Library) включает в себя стандартные объекты построения пользовательского интерфейса,

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

ООП характеризуется тремя базовыми принципами: инкапсуляция, наследование,

полиморфизм.

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

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

чтение и обновление их содержимого должно производиться посредством вызова соответствующих методов.

Наследование служит для использования однажды определенного класса в построении целой иерархии производных классов, каждый из которых наследует доступ к данным и методам работы с ними всех своих «родителей». То есть, можно построить иерархию классов, которая выражает родословное дерево классов. Классы организованы в единую древовидную структуру с общим корнем. Свойства и методы определенного класса автоматически доступны любому классу, расположенному ниже в иерархическом дереве.

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

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

действие своим собственным, подходящим для него образом. Другими словами,

полиморфизм – это использование одинаковых имен методов на разных уровнях иерархии классов.

Описанные базовые принципы присущи всем современным объектно-

ориентированным языкам. Кроме того, большинство языков добавляют дополнительные средства, такие как конструкторы, деструкторы, свойства (аксессоры), средства защиты внутренней структуры классов от несанкционированного использования извне,

переопределение операторов для классов и т.п.

Часть языков (иногда называемых «чисто объектными») целиком построена вокруг объектных средств - в них любые данные (возможно, за небольшим числом исключений в виде встроенных скалярных типов данных) являются объектами, любой код - методом какого-либо класса, и невозможно написать программу, в которой не использовались бы объекты. Примеры подобных языков - Smalltalk, Python, Java, C#, Ruby, AS3. Другие языки (иногда используется термин «гибридные») включают ООП-подсистему в исходно процедурный язык. В них существует возможность программировать, не обращаясь к объектным средствам. Классические примеры - C++, Delphi и Perl.

2.ЯЗЫК ПРОГРАММИРОВАНИЯ OBJECT PASCAL

2.1. Объектная модель

Объектно-ориентированным языкам программирования присущи три основные черты – инкапсуляция, наследование и полиморфизм.

Инкапсуляция – это объединение данных с процедурами и функциями для получения нового типа данных – класса.

Класс в Object Pascal представляет собой единство трех сущностей – полей, методов и свойств. Инкапсуляция позволяет во многом изолировать класс от остальных частей программы, сделать его «самодостаточным» для решения конкретной задачи. В результате класс всегда несет в себе некоторую функциональность. Например, класс TForm содержит

(инкапсулирует в себе) всё необходимое для создания Windows-окна, класс TTimer

обеспечивает работу программы с таймером и т.д.

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

В Object Pascal существует предопределённый класс TObject, который служит неявным предком тех классов, для которых предок не указан. Класс TObject выступает корнем иерархии классов. Он содержит ряд методов, которые по наследству передаются всем остальным классам (Create, Destroy и др.). Механизмы наследования полей, свойств и методов различаются.

Порождённый класс наследует от родителя все поля данных. Доступ к полям предка осуществляется по именам (так, как если бы они были определены в потомке). В

наследниках можно определять новые поля, но их имена должны отличаться от имён предка.

Свойство базового класса можно перекрыть (override) в производном классе,

например, чтобы добавить ему новый атрибут доступа или связать с другим полем или методом.

Метод базового класса тоже можно перекрыть в потомке. При этом в наследнике можно вызвать перекрытый метод предка, указав перед именем метода зарезервированное слово inherited.

Полиморфизм – это использование одинаковых имён методов на разных уровнях иерархии. При этом каждый класс реализует метод удобным для него образом.

Полиморфизм обеспечивает классам возможность решать схожие по смыслу проблемы разными способами. В Object Pascal поведенческие свойства класса определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках класса, программист может придавать этим потомкам отсутствующие у родителя специфические черты. Для изменения метода необходимо перекрыть его в потомке, то есть объявить в потомке одноименный метод и реализовать в нем нужные действия. В

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

2.2. Объекты и классы

Концепция объектно-ориентированного программирования основана на понятиях объекта и класса.

Классом в Object Pascal называется тип данных, содержащий поля, методы и свойства. Как и любой другой тип, класс даёт обобщённое описание, служащее образцом для создания конкретных экземпляров реализации.

В языках С++ и Delphi (Object Pascal) объекты – это программные конструкции,

формируемые классами. Объект является конкретным экземпляром класса. Класс определяет категорию объектов, содержит как объявление данных, так и функции их

обработки. Пользователю, как правило, предоставляется описание класса, а не его реализация. Главная забота класса – скрыть как можно больше информации. Объекты же

– это конкретные представители класса, экземпляры класса.

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

Классы определяются в секции type глобального блока. По форме объявления классы похожи на записи. Описание класса начинается служебным словом class и завершается словом end. Имя класса принято начинать с буквы T . Объекты (экземпляры класса)

описываются в разделе var.

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

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

Type

TMyClass = class(TParentClass) <поля>; <свойства>; <методы>;

. . .

end;

Var

MyClass1, MyClass2: TMyClass;

MyClass1, MyClass2 – это ссылки на объекты, которых ещё физически не существует.

Объекты появятся в процессе работы программы. После создания объект можно использовать в программе. Доступ к полям и методам объекта выполняется с помощью составных имён:

<имя объекта>.<имя поля> <имя объекта>.<имя процедуры>

Для сокращения текста кода можно использовать оператор with.

Когда объект станет не нужен, он должен быть уничтожен вызовом специального метода. Объекты могут выступать в программе не только в качестве простых переменных,

но и в качестве элементов массивов, полей записей, параметров процедур и функций.

Объекты могут служить полями других объектов.

2.3. Поля

Полями называются инкапсулированные в классе данные. Поля могут быть любого типа, в том числе – классами. Имена полей принято начинать с буквы F, например:

Type

TNewClass = class

FCod: Integer;

FCh: Char;

FObjField: TList;

...

end;

Каждый объект получает уникальный набор полей, но общий для всех объектов данного класса набор методов и свойств. Фундаментальный принцип инкапсуляции требует обращаться к полям только с помощью методов и свойств класса. Однако в Object Pascal разрешается обращаться к полям и напрямую:

Var

NewClass: TNewClass;

Begin

...

FCod:=0;

FCh:=‘с’;

end;

Класс-потомок получает все поля всех своих предков и может дополнять их своими,

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

2.4. Свойства

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

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

Таким образом, свойства – это специальный механизм классов, реализующий доступ к полям. Обычно свойство связано с некоторым полем и указывает те методы класса,

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

property Cod: integer read FCod write FCod; property Ch: сhar read FCh write FCh;

property PercentCritical: integer read FPercentCritical write SetPercentCritical;

После слова read указывается поле или метод, к которому происходит обращение при чтении значения свойства, а после слова write – поле или метод, к которому происходит обращение при записи свойства. Атрибуты read и write называют спецификаторами доступа. Если один из них опущен, то свойство можно только читать

(задан read) или только записывать (задан write). Метод чтения поля – это всегда функция,

возвращающая значение того же типа, что и свойство. Метод записи свойства – это всегда процедура, принимающая параметр того же типа, что и тип свойства. Один и тот же метод может использоваться для получения (установки) значений нескольких свойств одного типа. В этом случае каждому свойству назначается целочисленный индекс, который передаётся в метод первым параметром.

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

операции их чтения и записи ассоциируются с обычными полями и методами. Так как свойства не имеют адреса в памяти, к ним нельзя применить операцию @ и их нельзя передавать в качестве параметров-переменных (Var) процедур и функций.

Технология ООП в Object Pascal предписывает избегать прямого обращения к полям,

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

Обычно свойство связано с некоторым полем, но это не обязательно. Фактически свойство описывает один или два метода, которые осуществляют некоторые действия над данными того же типа, что и поле. Кроме обычных свойств у объектов существуют свойства-массивы (array properties). Свойство-массив – это индексированное множество свойств.

2.5. Методы

Метод представляет собой процедуру или функцию, определенную в рамках класса,

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

Следуя логике объектно-ориентированного программирования, все мыслимые действия над полями объекта необходимо определять в виде правил – процедур и функций. Именно это в конечном итоге обеспечивает простоту и универсальность ООП,

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

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

Type

TMyClass = class

Function MyFunc (aPar: Integer): Integer;

Procedure MyProc;

End;

Var

aObject: TMyClass;

...

Begin

...

aObject.MyProc;

...

end;

Методы класса могут перекрываться в потомках. Например:

Type

TParentClass = class

Procedure DoWork;

End;

TChildClass = Class (TParentClass)

Procedure DoWork;

End;

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

но, в общем случае, будут это делать по-разному. Такое замещение методов называется статическим, так как реализуется компилятором.

Всостав любого класса входят два специальных метода – конструктор и деструктор.

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

DiskGauge:=TDiskGauge.Create;

Конструктор создаёт объект. Создание объекта включает выделение памяти и инициализацию полей. Распределив объект в динамической памяти, конструктор помещает адрес этой области памяти в переменную Self, которая автоматически объявляется в классе. Деструктор разрушает объект: очищает поля и удаляет объект из кучи (освобождает память):

DiskGauge.Destroy;

После вызова деструктора обращаться к полям и методам объекта нельзя.

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

Create и деструктор Destroy. Можно даже определить несколько конструкторов и деструкторов, выполняющих свою работу разными способами. Объявление конструкторов и деструкторов аналогично объявлению обычных процедур, только вместо слова procedure используются constructor и destructor.

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

выделяется в памяти место под объект;

выделенная память заполняется. Поля, содержащие указатели и объекты, получают значение nil. Числовые поля заполняются нулями. Строки задаются пустыми;

выполняются действия, определяемые конструктором;

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