ИНКАПСУЛЯЦИЯ И СВОЙСТВА ОБЪЕКТА



Инкапсуляцией называется объединение трех сущностей класса – полей, методов и свойств в единое целое (складывание их в одну «капсулу»). Инкапсуляция делает класс «самодостаточным» для решения конкретной задачи.

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

Например, класс TEdit инкапсулирует в себе все необходимое для создания текстового поля и т.д.

Инкапсуляция представляет собой мощное средство обмена готовыми к работе программными заготовками. Библиотеки классов DELPHI – это набор «кирпичиков», созданных Borland для построения «многоэтажных зданий» ваших программ.

Под инкапсуляцией также понимается сокрытие полей и обеспечение доступа к ним только через специальные методыкласса (свойства). (Это нужно для обеспечения безопасности и уменьшения риска ошибочных действий над полями объектов ,например возрасту присвоить отрицательное значение) 

Чтобы поля сокрыть в описании класса указывается слово Private перед описанием скрываемых полей, а перед открытыми данными – Public. (По умолчанию все Public.)

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

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

В описании класса перед именем свойства записывают слово property (свойство). После имени свойства указывается его тип, затем — имена методов: функция чтения после слова read и процедура записи после слова write.   

Синтаксис:

property <имя свойства>: <тип> read <имя функции чтения> write <имя процедуры записи>;

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

function get<имя свойства>: тип;
procedure set<имя свойства>(v: тип);

Пример:

Type

TPerson=class

private

f_age: integer;

F_name:string;

Address:string;

Constructor Create(………);

Procedure Show; ...

procedure SetAge(age: integer);

Begin

if age>0 then f_age:=age

else writeln('Ошибка в Person.setAge: возраст не может быть отрицательным');

// это для Pascal ,а для Delphi ShowMessage('Ошибка’);

end;

function GetAge: integer;

Begin

writeln('Осуществлен доступ к полю f_age на чтение');

Result:=f_age; //GetAge:= f_age;

end;

publiс

property Age: integer read getAge write setAge;...

end;

Var

prof:TPerson;
v: integer;
...
prof:=TPerson.Create;
prof.Age:=-3; // выводится сообщение об ошибке

prof.Age:=47;

prof.Name:=’А.А. Сидоров’;

prof.Address:=’Ленина’;

………
v:=prof.Age; // выводится сообщение о чтении поля f_age

НАСЛЕДОВАНИЕ

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

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

Такой механизм получения новых классов называется порождением. Процесс образования подкласса – специализация. Процесс образования суперкласса – обобщение.

Например,

 У базового класса TButton (кнопка) есть дочерние классы BitBtn (кнопка с рисунком и надписью) и TSpeedButton (кнопка с рисунком).

При объявлении класса-потомка указывается класс родителя. Например, класс TEmployee (сотрудник) может быть порожден от рассмотренного выше класса TPerson путем добавления поля FDepartment (отдел). Объявление класса TEmplioyee в этом случае может выглядеть так:

Type

TEmployee = class (TPerson)

FDepartment: integer; // номер отдела

constructor Create(Name:TName; Dep:integer);

end;

 Правила наследования

1. Объект-наследник (потомок) получает все поля и методы предка.

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

3. Любой тип–потомок может быть родительским для других типов. В этом случае новый тип наследует поля всех своих предков .

4. Доступ к полям и методам родительских типов в описании типов – потомков выполняется так, как будто они описаны в самом типе-потомке.

5. Имена методов в родительских и дочерних типах могут совпадать. В этом случае метод дочернего типа «перекрывает» метод родительского.

 

ПОЛИМОРФИЗМ  

Полиморфизмнеразрывно связан с наследованием

Полиморфизм – возможность замещения методов класса-родителя одноименными методами класса-потомка.

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

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

 

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

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

 Способность использования одного и того же метода сообразно своему классу называется полиморфизмом.

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

· статические методы;

· виртуальные методы;

· динамические методы.

 Пример:

Класс TEmpioyee должен иметь свой собственный конструктор, обеспечивающий инициализацию класса-родителя и своих полей. Вот пример реализации конструктора класса TEmployee:

constructor TEmpioyee.Create(Name:Tname;Dep:integer);

Begin

inherited Create(Name); // inherited (англ.- унаследованный)

FDepartment:=Dep;

end;

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

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

Var engineer :TEmployee;

engineer := TEmployee.Create('Сидоров',413);

engineer.address := 'ул.Блохина, д.8, кв.10';

engineer.age := 23;

if engineer.dep=413 then …

 ________

Пример :

 

Type

Person=class

name: string;

age: integer;

constructor Create(nm: string; ag: integer);

Begin

name:=nm; age:=ag;

end;

procedure Print;

Begin

writeln('Имя: ',name,' Возраст: ',age);

end;

end;

Student=class(Person)

course, group: integer; новые поля

constructor Create(nm: string; ag,c,gr: integer);

begin //директивой inherited (англ.- унаследованный ) вызывается конструктор родительского //класса. После этого присваивается значение полю класса-потомка.

inherited Create(nm,ag); //перекрытие метода родительского

course:=c; group:=gr; //и добавление новых действий в методе

name:=nm; age:=ag;

end;

procedure Print;

Begin

inherited Print; //перекрытие метода родительского

writeln('Курс: ',course,' Группа: ',group);// и добавление новых действий в методе

end;

end;

Здесь метод Print производного класса Student вызывает вначале метод Print, унаследованный от базового класса Person, с помощью конструкции inherited Print. Аналогично конструктор Create класса Student вызывает вначале конструктор Create базового класса Person, также используя служебное слово inherited. Следует обратить внимание, что конструктор базового класса вызывается в этом случае как процедура, а не как функция, при этом создания нового объекта не происходит.

 

 


 

Сообщения ошибках

 

Наиболее часто встречающиеся сообщения об ошибках во время компиляции:

2.Identifier expected – Нужен идентификатор.

3.Unknown identifier – Неизвестный идентификатор. Этот идентификатор не объявлен.

4.Duplicate identifier – Повторный идентификатор.

5.Syntax error – Синтаксическая ошибка.

6.Unexpected end of file – Неожиданный конец файла программы или модуля.

Возможно:

- исходныйц текст программы закончился до последнего end;

- не завершили комментарий.

26.Type mismatch – Несовместимость типов.

29.Ordinal type expected – Нужен порядковый тип.

36.BEGIN expected – Нужен Begin.

37. END expected – Нужен END.

40. Boolean expresson expected – Нужно выражение типа Boolean.

62. Division by zero – Деление на нуль.

84. “;” expected – Нужна “;”. Подобные сообщения появляются также для других символв.

97.Invalid FOR control variable – Ошибочен тип переменной параметра цикла опреатора FOR.

 


Дата добавления: 2018-11-24; просмотров: 671; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!