Реферат: Программирование. Delphi
Внешне использование свойств в программе ничем не отличается от использования полей объекта. Вместе с тем между свойством и полем объекта существует принципиальное отличие: при присвоении и чтении значения свойства автоматически вызывается процедура, которая выполняет некоторую работу.
В программе на методы свойства можно возложить некоторые дополнительные задачи. Например, с помощью метода можно проверить корректность присваиваемых свойству значений, установить значения других, логически связанных со свойством, полей, вызвать вспомогательную процедуру.
Оформление данных объекта как свойства позволяет ограничить доступ к полям, хранящим значения свойств объекта, например можно разрешить только чтение. Чтобы инструкции программы не могли изменить значение свойства, в описании свойства надо указать только имя метода чтения. Попытка присвоить значение свойству, предназначенному только для чтения, вызывает ошибку времени компиляции. В приведенном выше описании класса TTperson свойство Name доступно только для чтения, а свойство Address - для чтения и записи.
Установить значение свойства, защищенного от записи, можно во время инициализации объекта. Ниже приведены методы класса ттрегзоп, обеспечивающие создание объекта класса ттрегзоп и доступ к его свойствам.
//конструктор объекта TTPerson
Constructor TTPerson.Create (Name:TName) ;
begin
// метод получения значения свойства Name
begin
end;
// метод получения значения свойства Address
Function TTPerson.GetAddress;
begin
Result: =FAddress;
end;
// метод изменения значения свойства Address
Procedure TTPerson.SetAddress (NewAddress: TAddress ) ;
Begin
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);
end;
В приведенном примере директивой inherited вызывается конструктор родительского класса, затем присваивается значение полю класса потомка.
После создания объекта производного класса в программе можно использовать поля и методы родительского класса. Ниже приведен фрагмент программы, демонстрирующей эту возможность.
engineer: =TEmployee.create ( ' Сидоров ' , 413 ) ;
engineer.address:='yл.Блохина, д.8, кв.10';
Первая инструкция создает объект типа TEmployee. Вторая устанавливает значение свойства, которое относится к родительскому классу.
Директивы Protected и Private
Помимо объявлений элементов класса (полей, методов, свойств) описание класса, как правило, содержит директивы protected (защищенный) и private (закрытый), которые устанавливают степень видимости элементов класса в программе.
Элементы класса, объявленные в секции protected, доступны только в порожденных от него классах. Область видимости элементов класса этой секции не ограничивается модулем, в котором находится описание класса. Обычно в секцию protected помещают описание методов класса.
Элементы класса, объявленные в секции private, видимы внутри модуля. Эти элементы не доступны за пределами модуля, даже в производных классах. Обычно в секцию Private помещают описание полей класса, а методы, обеспечивающие доступ к этим полям, помещают в секцию protected.
Ниже приведено описание класса TTPerson, в которое включены директивы управления доступом.
private
Fname:TName; { значение св-ва Name }
Faddress:TAddress; ( значение св-ва Address)
protected
Constructor Create (Name :TName);
Procedure SetAddress(NewAddress:TAddress);
Property Name:Tname
read GetName;
Property Address :Taddress
read GetAddress
write SetAddress;
end;
Замечание
Если надо чтобы элементы класса были полностью скрыты, то определение класса следует поместить в отдельный модуль.
Полиморфизм и виртуальные методы
Полиморфизм - это возможность использовать одинаковые имена для методов, входящих в различные классы. Концепция полиморфизма обеспечивает при применении метода к объекту использование именно того метода, который соответствует классу объекта.
Пусть определены три класса, один из них является базовым для двух других.
type // базовый класс
TPerson=class
constructor Create (name: string);
function info: string;
virtual;
// производный от базового Tperson
TStud=class (TPerson)
fgr: integer; { номер группы }
constructor Create (name: string; gr: integer) ;
function info: string; override;
end;
// производный от базового Tperson
Tprof=class (TPerson)
fdep: string; { название кафедры }
constructor Create(name:string;dep:string);