Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа 2012 / ВВЕДЕНИЕ В ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ.doc
Скачиваний:
45
Добавлен:
07.06.2015
Размер:
183.81 Кб
Скачать

Основные принципы ооп

Три основополагающих принципа объектно-ориентированного программирования (ООП): инкапсуляция, наследование, , полиморфизм

Инкапсуляция и свойства объекта

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

Например, класс 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);