Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
417.28 Кб
Скачать

Модули.

Модули – это программные единицы, служащие для размещения фрагментов программ, работают они совместно с основной программой, но компилироваться могут отдельно. Используемые модули указываются в разделе Uses.

Конструкция модуля

Unit <имя модуля>;

Interface

implementation

initialization

finalization

end.

Заголовок модуля Unit<имя>; для правильной работы имя модуля должно совпадать с именем дискового файла в котором записан модуль.

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

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

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

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

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

КЛАССЫ, ОБЪЕКТЫ

Классыэто типы специального вида, которые содержат поля, методы и свойства.

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

Конкретные экземпляры класса называются объектами.

Объявление класса

Type 

TmyCl=class(Tobject)

Fint:integer;

Fstr:string;

Function Func1(a:real):integer;

Procedure Proc1;

End;

Var

MyClass:TmyCl;

Function TmyCl.Func1(a:real):integer;

Begin result:=a* Fint ; end;

Procedure TmyCl.Proc1;

Begin …; end;

Begin

MyClass:=TmyCl.create;

MyClass.Fint:=10;

MyClass. Proc1;

MyClass.Free;

End.

ПРИНЦИПЫ ООП

В основе классовой борьбы лежат три фундаментальных принципа:

  • инкапсуляция, наследование, полиморфизм.

Инкапсуляция – это объединение в одно целое трех сущностей: полей, методов и свойств.

Поля методы и свойства называются членами классов.

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

Все классы OBJECT PASCAL являются потомками класса TОbject. Наследование приводит к тому, что создается дерево классов, разрастающееся по мере удаления от потомка. Программисты создавая новые классы, на основе старых не вникают в подробности программного кода старых. Значительно возрастает преемственность кода.

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

ИНКАПСУЛЯЦИЯ Инкапсуляция – это объединение в одно целое трех сущностей: полей, методов и свойств.

Поля – это данные.

Методы – это процедуры, обрабатывающие данные.

Свойства – это механизм доступа к данным.

Инкапсуляция позволяет изолировать класс от остальных частей программы, сделать его самодостаточным для решения конкретной задачи.

Инкапсуляция предполагает разграничение доступа разработчиков разного уровня к различным членам класса.(если ты разрабатываешь класс, то тебе доступны все члены класса, если ты используешь класс, то только те, которые определят поведение класса), Потому что:

1.Пользователи класса не должны видеть подробности, которыми оперируют разработчики.

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

В Delphi есть четыре модификатора разграничения доступа:1)public, 2)published, 3)protected, 4)private.

Модификатором public объявляют (помечают ) члены класса видимые везде.

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

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

Секция, не имеющая модификатора доступа, по умолчанию считается published.

Модификатором protected объявляют члены класса доступные методам самого класса и их потомкам.Модификатором private объявляют члены класса видимые только в модуле, где описан класс, т.е. это локальные описания.Любая секция может объявляться сколько угодно раз, порядок следования секций произвольный. Внутри каждой секции объявляются сначала поля затем методы и свойства.

ПОЛЯ

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

В классе поля описываются как обычные переменные.

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

СВОЙСТВА Как мы помним:

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

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

Function GetVozr:integer; //верни значение возраста.

Procedure SetVozr(r:integer); //установи возраст, но без глупостей не 1000 лет

Синтаксис описания свойства выглядит так:

Property Vozrast:integer read GetVozr write SetVozr;

Property Vozrast:integer read GetVozr ;

Property Vozrast:integer write SetVozr;

Property Vozrast:integer;

МЕТОДЫ

Инкапсулированные в классе процедуры и функции называются методами.

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

В заголовке описания реализации метода используют составное имя метода (имя класса точка имя метода).

В теле описания реализации метода собствен-ные поля используются без указания имени класса. (этим методы отличаются от прочих процедур)

В ООП различаются следующие виды методов:

Методы класса

Конструктор и деструктор

Виртуальные

Динамические

Абстрактные

Перегружаемые

МЕТОДЫ КЛАССА

Некоторые методы (называются методы класса) могут вызываться без создания и инициализации объекта, они характеризуют не объект, а класс. Объявляются с помощью зарезервированного слова class.

Обращения к полям с их помощью запрещаются.

Пример:

Type TMyCl=class Class Function GetClassName: String; End;

Var S:string;

Class Function GetClassName: String;

Begin Result:=‘TmyCl’; End;

КОНСТРУКТОР И ДЕСТРУКТОР

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

В классе TОbject конструктор называется create деструктор destroy.

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

Type TmyCl=class(TObject) … end;

Var

Ob1: TmyCl;//выделяет указатель 4 б, cначалa хранит nil

Для разворачивания же объекта в динамической памяти используется метод класса конструктор (для Tobject это Create) в таком виде

Ob1:= TmyCl.Create;

В результате применения метода create:

выделяется дин память и разворачивается объект;

  • инициализируется объект

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

Любые действия с объектом возможны после работы конструктора. Деструктор разрушает объект в динамической памяти.

Type

TMyCl=class Fint: integer; End;

Var MyOb:TmyCl;

Begin MyOb.Fint:=0; //комментировать самостоятельно

MyOb.Create; //

MyOb:=TmyCl.Create; //

MyOb.Fint:=0; //

MyOb.Destroy;//

MyOb.Free; //

End.

Утечка памяти

Type TMyCl=class Fint: integer; End;

Var

MyOb:TmyCl; i:integer;

Begin For i:=1 to 10 do MyOb:=TmyCl.Create; MyOb.Fint:=0; End.

ПЕРЕОПРЕДЕЛЕНИЕ (ПЕРЕКРЫТИЕ) МЕТОДОВ

Type Tpar=class Procedure DoWork; End;

Tchild=class(Tpar) Procedure DoWork; End;

Var O1: Tpar; O2: Tchild;

Procedure Tpar . DoWork; Begin writeln(‘стучит молотком’); end;

Procedure Tchild . DoWork; Begin writeln(‘играется в песочнице’); end;

Begin O1:= Tpar.create; O2:= Tchild.create;

O1.DoWork; // стучит молотком

O2.DoWork; // играется в песочнице end.

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

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

ПЕРЕОПРЕДЕЛЕНИЕ КОНСТРУКТОРА

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

Type Tfigure = class end;

Tcircle = class (Tfigure) r:real; constructor create(ar:real); end;

var figure:Tfigure; circle:Tcircle;

constructor Tcircle.create(ar:real); begin inherited create; r:=ar;// инициализируем end;

Begin figure:=Tfigure.Create; circle:=Tcircle.create(1.25); end.

ПОЛИМОРФИЗМ

Замещение метода может быть сделано как на этапе компиляции так и на этапе выполнения программы. Такое замещение называется динамическим (или виртуальным).

Синтаксис объявления таков:

Tpar=class

Procedure DoWork; virtual; [dynamic;] //метод виртуальный

End;

Tchild=class(Tpar)

Procedure DoWork; override;//надо переопределять при выпол

End;

Полиморфизм допускает инициализацию объектной переменной любым классом потомком

Type TMan= class procedure Obed; end;

TStud = class (TMan) Procedure Obed; end;

Var Man:TMan; Stud:TStud;

procedure TMan.Obed; begin writeln('плотно поел');end;

procedure TStud.Obed; begin writeln('съел коржик');end;

begin

Man:=TStud.Create; //предок инициал потомком

man.Obed; //'плотно поел' 'съел коржик (man as Tman).Obed;

Man.Free;

Операции as и is

(man as Tman).Obed; //приведение типа

if man is Tman then …;//определение типа

Абстрактные методы

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

Реализация абстрактного метода не описывается. Вызов не перекрытого метода приводит к ошибке периода исполнения.

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

ТИП «КЛАСС»

Type TmetaClass = Class of TObject;

Var MetaClass: TmetaClass;//может хранить в себе объект любого класса потомка TObject

Procedure UseObject(Obj: TmetaClass);

Begin UseObject(TButton); UseObject(TLabel); end;

УКАЗАТЕЛЬ НА СЕБЯ

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

СОБЫТИЯ.

Событие – это то, что происходит в результате работы компьютера. На низком уровне это изменения, (нажатие кнопки, исход времени, деление на ноль) вызывающие прерывания.

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

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

Такие методы называются обработчиками событий.

Пример:

Type TControl = class (TComponent) Private FOnDblClick: TNottifyEvent ; …………………….. Protected

property OnDblClick: TNottifyEvent read FOnDblClick write FOnDblClick; ……………………… end; 

TNotifyEvent = Procedure(Sender:TObject) of object;

ДЕРЕВО КЛАССОВ DELPHI

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

Класс TObject.

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

Constructor Create – выделяет динам память, инициализацию не делает, т.к. перегружается. Destructor Destroy; virtual; - освобождает выделенную память. Procedure Free – проверяет существование и, если память выделялась, то освобождает ее.

Методы класса: ClassName: shortString; - возвращает имя класса данного объекта ClassNameIs (const Name:string):Boolean; - данный класс совпадает Name InheritsForm(aClass:Tclass):Boolean; - является ли класс предком дан кл InstanceSize:Longint; - возвращает размер класс или объекта.

Класс TPersistent.

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

МЕТОДЫ:

Procedure Assign(Source:Tpersistent); - присваивает данному объекту данные, содержащиеся в объекте с именем Source

Function GetNamePath: string; dynamic; - возвращает строку,содержащую имя объекта.

Function GetOwner: TPersistent; dynamic;-возвращает указатель на владельца объекта.

Класс TСomponent

Вершина иерархии компонентов. Потомки его - невизуальные компоненты (TApplication, Tform таймер, меню, диалоговые окна).

Свойства Name (строка ) – имя компонента. При помещении компонента на форму присваивается стандартное имя Label1, Edit1, которое можно заменить на более осмысленное, при этом имя должно быть правильным идентификатором. Tag: Longint; - некоторое число, которым разработчик может распоряжаться по усмотрению.

В классе TComponent вводится концепция принадлежности, которая распространяется на всю VCL. Суть:1)любой компонент Делфи является собственностью другого компонента. 2)при разрушении компонента владельца автоматически разрушается принадлежащие ему компоненты.

Свойства реализующие концепцию принадлежности: ComponentCount:Integer; - количество компонентов во владении ComponentIndex:Integer; - номер компонента в списке владельца (нумерация с нуля). Components [Index:Integer]:TComponent; - список компонентов, для которых данный является владельцем.

Owner: TComponent; - содержит указатель на компонент владелец для текущего компонента.

МЕТОДЫ Constructor Create (AOwner: TComponent);virtual; - создает объект данного класса, помещает ссылку на себя в массив Components, своего владельца, имя которого указано в AOwner.

Destroy Tcomponent;- удаляет из памяти компоненты данного владельца. Procedure InsertComponent(Acomponent: TComponent); - вставляет новый компонент с именем Acomponent. Procedure RemoveComponent(Acomponent: TComponent); - удаляет компонент Acomponent.

Класс tСontrol.

Потомки этого класса называются элементами управления.

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

В потомках TControl вводится понятие родительского элемента управления суть его в следующем:

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

Не следует путать владельца и родителя

Свойства и методы для обеспечения отношения родительский-дочерний .

Свойства.

Parent:TWinControl; - задает родителя текущему элементу.

ParentBiDiMode:Boolean; ParentColor:Boolean; ParentFont:Boolean; ParentShowHint:Boolean;(ко всем относится) указывает использует ли дочерний компонент значение свойства BiDiMode, Color Font, ShowHint родителя.

Свойства позиционирования и выравнивания

С окном связывается система координат

СВОЙСТВА:

Left,Тop, Height,Width, ClienHeight,ClienWidth :Integer;

AutoSize:Boolean;– автоматическая подстройка размера компонента под размер содержимого (если true).

ClienHeight:Integer; ClienWidth:Integer; - задает высоту и ширину клиентской области элемента управления в пикселях,

Способ выравнивания элемента в родительском компоненте.

Type

TAlign=(alNone,alTop,alBottom,alLeft,alRight,alClient);

Var

Align: TAlign;

Привязка дочернего элемента к краям родителя.

Type

TAnchorKind=(akTop,akLeft,akRight,akBottom);

TAnchors=set of TAnchorKind;

Var

Anchors:T Anchors;

Свойства, определяющие внешний вид элементов управления.

Type TBiDiMode=(bdLeftToRight,bdRightToLeft, bdRightToLeftNoAlign, bdRightToLeftReadingOnly); Property BiDiMode: BiDiMode; - определяет вывод текста учетом национальной специфики, по умолчанию bdLeftToRight вывод текста слева направо. И прокручивание тоже.

Type TCaption=string; Property Caption:TCaption; заголовок элемента.

Весьма важные СВОЙСТВА Enabled:Boolean; - реагирует ли компонент на мышь и клаву.

Font:TFont; - шрифт, перечислимый тип, из шрифтов системы.

Hint :TCaption; - текст подсказки. ShowHint:Boolean; - разрешает или запрещает окно подсказки.

Text:TCaption; текст ассоциированный с элементом управления, например Edit.

Visible:Boolean; - отображается ли элемент управления на экране.

МЕТОДЫ Hide - делает компонент невидимым visible=false. Show - делает компонент видимым. Refresh - стирает и рисует заново элемент

BringToFront помещает элемент поверх остальных SendToBack - помещает элемент ниже всех остальных.

События при нажатии мышью на левую кнопку.

Type

TNotifyEvent=procedure(Sender:Tobject) of object;

Property OnClick:TNotifyEvent;

- возникает при выборе элемента управления, если была нажата и отпущена левая кнопка мыши.

Property OnDblClick:TNotifyEvent

возникает при двойном щелчке левой клавишей мыши по элементу управления.

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

Type TMouseEvent=procedure(Sender:Tobject; Button:TMouseButton; Shift:TShiftState;X,У:integer) of object;

Property OnMouseDown: TMouseEvent; Property OnMouseUp: TMouseEvent; - событие возникает при нажатии /отпускании клавиши мыши, когда указатель мыши находится над элементом управления.

Button (mbLeft, mbRight, mbMiddle)- какая кнопка мыши нажата. Shift [SsShift, ssLeft, ssRight, ssMiddle, ssAlt, ssCtrl]– множество, обозначающее кнопки нажатые одновременно с Shift,Alt,Ctrl. X,Y –координаты указателя мыши в клиентской области компонента.

Type TMouseEvent=procedure(Sender:Tobject; Button:TMouseButton; Shift:TShiftState;X,У:integer) of object; Property OnMouseMove:TMouseMoveEvent; - событие возникает при перемещении курсора мыши, над элементом управления

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]