ИНКАПСУЛЯЦИЯ И СВОЙСТВА ОБЪЕКТА
Инкапсуляцией называется объединение трех сущностей класса – полей, методов и свойств в единое целое (складывание их в одну «капсулу»). Инкапсуляция делает класс «самодостаточным» для решения конкретной задачи.
Например, класс 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!