- •1. Пользователи класса не должны видеть подробности, которыми оперируют разработчики.
- •2. Прямой доступ к полям хотя и возможен, но не всегда желателен, т.К. Бесконтрольность может привести к ошибкам.
- •Var o1: TmyCl;
- •Var s:string;
- •Var MyOb:TmyCl;
- •Var o1: Tpar; o2: Tchild;
- •Var figure:Tfigure; circle:Tcircle;
- •Var o1,o2: TmyCl; n:integer;
- •Var мan: tМan;
- •Var par: Tpar; child: Tchild;
- •If man is Tman then …;//определение типа
- •Var cIrcle:tcIrcle; Rectangle:tRectangle;
- •Var MetaClass: TmetaClass;//может хранить в себе объект любого класса потомка Tobject Procedure UseObject(Obj: TmetaClass);
- •Любой компонент Делфи является собственностью другого компонента.
- •При разрушении компонента владельца автоматически разрушается принадлежащие ему компоненты.
- •X:Longint;
- •Visible:Boolean; - отображается ли элемент управления на экране.
- •0: (Left, top, right, bottom: integer);
- •1: (TopLeft, BottomRight: tPoint);
- •Interval: cardinal; - интервал в милисекундах после которого начинается событие OnTimer.
- •Items:tString; - задает элементы списка.
- •Items:tString; - задает элементы списка.
- •Items:tString;-содержит список названий переключателей.
- •1. Контроль обращений к данным
- •2. Контроль вычислений
- •3. Контроль передачи управления
- •4. Контроль межмодульных интерфейсов
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; Begin For I:=1 to 10 do MyOb:=TmyCl.Create; MyOb.Fint:=0; MyOb.Free End.
Билет 7.
ПЕРЕОПРЕДЕЛЕНИЕ (ПЕРЕКРЫТИЕ) МЕТОДОВ
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 (figure) 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.
Билет 8.
ПОЛЯ
Поля – это данные, инкапсулированные в классе.
В классе поля описываются как обычные переменные.
Если разворачиваются несколько объектов одного класса, то каждый объект получает уникальный набор полей и общий набор методов и свойств.
Type
TmyCl=class(Tobject)
Fint:integer;
Fstr:string;
procedure proc1(var m:integer);
End;
Var o1,o2: TmyCl; n:integer;
procedure TmyCl.proc1(var m:integer); Begin m:= Fint +5; End;
Begin
O1:= TmyCl.create;
O2:= TmyCl .create;
O1.Fint:=10; O2.Fint:=20;
O1.proc1(n); write(n);
O2.proc1(n); write(n);
End.
СВОЙСТВА
Как мы помним:
Свойства – это механизм доступа к данным.
Возможно прямое обращение к полям, но фундаментальный принцип инкапсуляции требует обращаться к полям посредством свойств и методов (во избежание ошибок, для обеспечения корректности изменения данных).
Type
TМan=class(Tobject)
FVozrast:integer;
End;
Var
мan: Tмan;
Begin
мan:= Tмan.create;
мan.Fvozrast:=188;
Man.Free;
End.
В описании свойства используются два метода, один для чтения, другой для записи значения свойства (через эти методы реализуется контроль корректности вводимых данных и др. действия).
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;
Type
TMan=class(Tobject)
private
FVozrast:integer;
protected
Function GetVozr:integer; Procedure SetVozr(r:integer);
public
Property Vozrast:integer read GetVozr write SetVozr;
End;