скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Программирование. Delphi

Реферат: Программирование. Delphi

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

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

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

Замечание

Строго говоря, для того, чтобы разрабатывать приложения в Delphi на базе предоставляемых средой разработки компонентов, знание концепции ООП не является необходимым. Однако для более глубокого понимания того, как программа взаимодействует с компонентами, что и почему Delphi добавляет в текст программы, материал данной главы весьма полезен.

Класс

Классический язык Pascal позволяет программисту определять свои собственные сложные типы данных - записи (records). Object Pascal, поддерживая концепцию объектно-ориентированного программирования, дает возможность определять классы. Класс - это сложная структура, включающая в себя помимо описания данных описание процедур и функций, которые могут быть выполнены над представителем класса - объектом.

Вот пример описания простого класса:

TTPerson=class

Private

 fname: string [15] ;

f address: string [35] ;

public

procedure show;

end;

Данные класса называются полями, процедуры и функции - методами. В приведенном примере TTPerson - это имя класса, fname и faddress - имена полей, show - имя метода.

Замечание

Согласно принятому в Delphi соглашению имена полей должны начинаться с буквы f (от слова field - поле).

В программе описание класса помещают в раздел описания типов (type).

Объект

В программе представители класса - объекты, объявляются в разделе var. Например, так:

var

student: TTPerson;

professor: TTPerson;

Следует обратить особое внимание на то, что в Object Pascal объект - это динамическая структура. Переменная-объект содержит не данные, а ссылку на данные объекта. Поэтому программист должен позаботиться о выделении памяти для этих данных.

Выделение памяти осуществляется при помощи специального метода класса - конструктора, которому обычно присваивают имя create (создать). Чтобы подчеркнуть особую роль и поведение конструктора, в описании класса вместо слова procedure используется слово constructor. Ниже приведено описание класса TTPerson, в состав которого введен конструктор.

TTPerson = class

private

 fname: string [ 15] ;

 f address: string [35] ;

 constructor create; // конструктор

 public

procedure show; // метод

end;

Выделение памяти для данных объекта происходит присваиванием значения результата применения метода-конструктора к типу (классу) объекта. Например, после выполнения инструкции

professor: =TTPerson.create ;

выделяется необходимая память для данных объекта professor .

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

constructor TTPerson.create ;

begin

fname: = ‘ ‘ ;

faddress:=’’' ;

end;

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

После объявления и инициализации объект можно использовать, например, установить значение поля объекта. Доступ к полю объекта осуществляется указанием имени объекта и имени поля, которые отделяются друг от друга точкой. Хотя объект является ссылкой, однако правило доступа к данным с помощью ссылки, согласно которому после имени переменной, являющейся ссылкой, надо ставить значок ^ на объекты не распространяется. Например, для доступа к полю fname объекта professor вместо

professor^. Fname

 надо писать

professor.fname

Очевидно, что такой способ доступа к полям объекта более естественен.

Если в программе некоторый объект больше не используется, то можно освободить память, занимаемую полями этого объекта. Для выполнения этого действия используют метод-деструктор free. Например, чтобы освободить память занимаемую полями объекта professor, достаточно записать

professor.free;

Метод

Методы класса (процедуры и функции, объявление которых включено в описание класса) выполняют действия над объектами класса. Чтобы метод был выполнен, надо указать имя объекта и имя метода, отделив одно имя от другого точкой. Например, инструкция

professor.Show;

вызывает применение метода show к объекту professor. Фактически инструкция применения метода к объекту - это специфический способ записи инструкции вызова процедуры.

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

Ниже приведен пример определения метода show приведенного выше класса TTPerson.

// метод show класса TTPerson

procedure TTPerson. show;

 begin

ShowMessage(‘Имя:'+fname+#13+'Адрес: '+faddress) ;

 end;

 Следует обратить внимание на то, что в инструкциях метода доступ к полям объекта осуществляется без указания имени объекта.

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

Под инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса.

В Object Pascal ограничение доступа к полям объекта реализуется при помощи свойств объекта. Свойство объекта характеризуется полем, хранящем значение свойства, и двумя методами, обеспечивающими доступ к полю свойства. Метод установки значения свойства называется методом записи свойства (write), метод получения значения свойства называется методом чтения свойства (read).

В описании класса перед именем свойства записывают слово property (свойство). После имени свойства указывается его тип, затем имена методов, обеспечивающих доступ к значению свойства. После слова read указывается имя метода, обеспечивающего чтение свойства, после слова write - записи свойства имя метода. Ниже приведен пример описания класса TTPerson, содержащего два свойства: Name и Address.

type

TName=string[15] ;

 TAddress=string[35] ;

TTPerson = class

 Private

 FName:Tname; // значение св-ва Name

Faddress:TAdress; // значение св-ва Address

Constructor Create (Name :Tname) ;

Procedure Show;

Function GetName:TName;

Function GetAddress:TAddress;

Procedure SetAddress (NewAddress: TAddress ) ;

Public

Property Name: Tname

read GetName;

Property Address: Taddress

read GetAddress

write SetAddress;

end;

В программе для установки значения свойства не обязательно записывать инструкцию применения к объекту метода установки значения свойства, можно записать обычную инструкцию присваивания значения свойству. Например, чтобы присвоить значение свойству Adress объекта student, достаточно записать

Student.Address:= 'С.Петербург, ул.Садовая 21, кв. 3';

Компилятор перетранслирует приведенную инструкцию присваивания значения свойству в инструкцию вызова метода

Student.SetAddress ( ' С. Петербург, ул. Садовая 21, кв .3'),•

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

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

Оформление данных объекта как свойства позволяет ограничить доступ к полям, хранящим значения свойств объекта, например можно разрешить только чтение. Чтобы инструкции программы не могли изменить значение свойства, в описании свойства надо указать только имя метода чтения. Попытка присвоить значение свойству, предназначенному только для чтения, вызывает ошибку времени компиляции. В приведенном выше описании класса TTperson свойство Name доступно только для чтения, а свойство Address - для чтения и записи.

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

//конструктор объекта TTPerson

Constructor TTPerson.Create (Name:TName) ;

begin

FName:Name ; end;

// метод получения значения свойства Name

Function TTPerson.GetName ;

 begin

Result: =FName ;

 end;

// метод получения значения свойства Address

Function TTPerson.GetAddress;

 begin

Result: =FAddress;

end;

// метод изменения значения свойства Address

Procedure TTPerson.SetAddress (NewAddress: TAddress ) ;

Begin

 if FAddress =' '

then FAddress: =NewAddress;

 end;

Приведенный конструктор объекта TTPerson создает объект и устанавливает значение поля FName, определяющего значение свойства Name.

Инструкции программы, обеспечивающие создание объекта класса TTPerson и установку его свойства, могут быть, например, такими:

student: =TTPerson.create ( ' Иванов ' ) ;

student.address:='yл. Садовая, д.З, кв.25';

Наследование

Концепция объектно-ориентированного программирования предполагает возможность определять новые классы посредством добавления полей, свойств и методов к уже существующим классам. Такой механизм получения новых классов называется порождением. При этом новый, порожденный, класс (потомок) наследует свойства и методы своего базового, родительского класса.

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

TEmployee = class (TTPerson)

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

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

end;

Заключенное в скобки имя класса TTPerson показывает, что класс TEmployee является производным от класса TTPerson. В свою очередь, класс ттрегзоп является базовым для класса TEmployee.

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

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

begin

inherited Create (Name);

FDepartment: =Dep;

end;

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

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

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

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

Первая инструкция создает объект типа TEmployee. Вторая устанавливает значение свойства, которое относится к родительскому классу.

Директивы Protected и Private

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

Элементы класса, объявленные в секции protected, доступны только в порожденных от него классах. Область видимости элементов класса этой секции не ограничивается модулем, в котором находится описание класса. Обычно в секцию protected помещают описание методов класса.

Страницы: 1, 2


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.