Основные принципы ооп
Три основополагающих принципа объектно-ориентированного программирования (ООП): инкапсуляция, наследование, , полиморфизм
Инкапсуляция и свойства объекта
Инкапсуляцией называется объединение трех сущностей класса – полей, методов и свойств в единое целое (складывание их в одну «капсулу»). Инкапсуляция делает класс «самодостаточным» для решения конкретной задачи.
Например, класс 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
Пример. Описание свойств.
type TNewClass = class(TObject)
private
FCode: integer;
FSign: char:
FNote: string;
published
property Code: integer read FCode write FCode;
property Sign: char read FSign write FSign;
property Note: string read FNote write FNote;
end;
Пример3. Описание свойств.
interface
type
// описание класса CPatient – «Пациент»
CPatient = class
F_Name: string; // имя
F_Age : Integer; // возраст
F_Diagnosis : string; // диагноз
F_t : Real; // температура
constructor Create(N : string; A : Integer);
destructor Destroy;
function getTemp : Real;
procedure setTemp(new_t : Real);
property Temp : Real read getTemp write setTemp;
end;
implementation
constructor CPatient.Create(Name : string; Age : Integer);
begin
WriteLn(‘Создается объект класса ’);
F_Name := Name;
if Age < 0 then
begin
WriteLn(‘...Некорректно задан возраст (’, Age, ‘)!’);
Age := 0
end
else f_Age := Age;
end;
procedure CPatient.setTemp(new_t : Real);
begin
if new_t < 20 then begin WriteLn( Name,' скорее мертв, чем жив... '); F_Diagnosis := ‘Труп’; end
else F_t := new_t;
if (new_t> 41) or (new_t < 34) then WriteLn(‘...Критическое значение температуры (’,New_t ‘)!’);
end;
function CPatient.getTemp() : Real;
begin
if (t > 36.4) and (t < 36.8) then WriteLn(‘...Температура в норме.’);
if (t <= 36.4) and (t > 35) then WriteLn(‘...Температура понижена!’);
if (t <= 35) then WriteLn(‘...Температура низкая!!!’);
if (t >= 36.8) and (t < 38) then WriteLn(‘...Температура повышена!’);
if (t >= 38) then WriteLn(‘...Температура высокая!!’);
if (t >= 40) then WriteLn(‘...Температура очень высокая!!!’);
getTemp := f_t; // или result:=F_t;
end;
var
Patient1, Patient2: CPatient;
begin
Patient1 := CPatient.Create(‘Иванов’, 40);
Patient2 := CPatient.Create(‘Сидоров’, 27);
ShowMessage(Patient1.f_Name + ‘ - ’+ Patient1.F_age);
Patient1.Temp := Random(151) /10.0 + 30;
WriteLn(‘ОШИБКА В ЛЕЧЕНИИ!’);
Patient2.Temperature := Random(20);
WriteLn(‘.у Сидорова температура=.’, Patient2.Temperature, ‘диагноз =’, Patient2.F_Diagnosis);
Patient1.destroy;
Patient2.destroy;
end.
Ниже приведен пример описания класса TPerson, содержащего два свойства: Name и Address.
type
TName = string[15];
TAddress = string[35];
TPerson = class // класс
private
FName: TName; // значение свойства Name
FAddress: TAddress; // значение свойства Address
f_age: integer;
Constructor Create(Name:Tname);
Procedure Show;
Function GetName: TName;
Function GetAddress: TAddress;
Procedure SetAddress(NewAddress:TAddress);
public
Property Name: Tname // свойство Name
read GetName; // доступно только для чтения разрешить только чтение
Property Address: TAddress // свойство Address
read GetAddress // доступно для чтения
write SetAddress; // и записи
… …
end;
// метод получения значения свойства Name
Function TPerson.GetName;
begin
Result:=FName;
end;
// метод получения значения свойства Address
function TPerson.GetAddress;
begin
Result:=FAddress;
end;
// метод изменения значения свойства Address
Procedure TPerson.SetAddress(NewAddress:TAddress);
begin
if FAddress =' '
then FAddress := NewAddress;
end;
В программе для установки значения свойства надо записать обычную инструкцию присваивания значения свойству.
Например, чтобы присвоить значение свойству Address объекта student, достаточно записать
var student: TPerson;
student.Address := 'С.Петербург,ул.Садовая 21, кв.3';
Например 2,
var
prof:TPerson;...
prof.Age:=35;
В DelphiЗначение свойства объекта можно задавать либо вИнспекторе объектов, либо прописывать в программном коде
Например, Form1.Visible:= false.
В программе на методы свойства можно возложить некоторые дополнительные задачи. Например, с помощью метода можно проверить корректность присваиваемых свойству значений, установить значения других полей, логически связанных со свойством, вызвать вспомогательную процедуру.
В приведенном выше описании класса TPerson свойство Name доступно только для чтения, а свойство Address — для чтения и записи. Попытка присвоить значение свойству, предназначенному только для чтения, вызывает ошибку времени компиляции.
Установить значение свойства, защищенного от записи, можно во время инициализации объекта. .
Приведенный конструктор объекта TPerson создает объект и устанавливает значение поля FName, определяющего значение свойства Name.
// конструктор объекта TPerson
Constructor TPerson.Create(Name:TName);
begin
FName:=Name;
end;
// метод получения значения свойства Name
Function TPerson.GetName;
begin
Result:=FName;
end;
Операторы, обеспечивающие создание объекта класса TPerson и установку его свойств, могут быть, например, такими:
student := TPerson.Create('Иванов');
student.Address := 'ул. Садовая, д.3, кв.25';
student.Age:=17;
if student.Name='Иванов' then inc(student.Age);