4834

Введение в объектно-ориентированное программирование

Лекция

Информатика, кибернетика и программирование

Введение в объектно-ориентированное программирование Цель: Научить студентов создавать объектно-ориентированное приложение. Задачи: Воспитательная: работа над собой. Учебная: создание приложений. Развивающая: развитие внимательности. План занятия...

Русский

2012-11-27

129.5 KB

13 чел.

Введение в объектно-ориентированное программирование

Цель:

Научить студентов создавать объектно-ориентированное приложение.

Задачи:

Воспитательная: работа над собой.

Учебная: создание приложений.

Развивающая: развитие внимательности.

План занятия.

  1.  Организационный момент.
  2.  Изучение нового материала.
  3.  Контрольные вопросы.
  4.  Резюме.
  5.  Домашнее задание.

Изучение нового материала.

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

Класс

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

TPerson = class

   private

       fname: string[15];

       faddress: string[35];

   public

       procedure Show;

end;

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

Объект

Объекты как представители класса объявляются в программе в разделе var, например:

var

   student: TPerson;

   professor: TPerson;

   Выделение памяти осуществляется при помощи специального метода класса – конструктора, которому обычно  присваивают имя Create (создать). Для того чтобы подчеркнуть особую роль и поведение конструктора, в описании класса вместо слова procedure используется слово constructor. Ниже приведено описание класса TPerson, в состав которого введен конструктор:

TPerson = class 

   private

       fname: string [ 15 ];

       faddress: string[35];

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

   public

       procedure show; // метод

end;

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

professor := TPerson.Create;

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

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

constructor TPerson.Create;

begin

   fname := ' ';

   faddress := ' ';

end;

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

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

   Например, для доступа к полю fname объекта professor  вместо

   professor^.fname

надо писать

   professor.fname

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

professor.Free;

Метод

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

   professor. Show;

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

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

// метод Show класса TPerson

procedure TPerson.Show;

   begin

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

  end;

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

   Под инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса. В языке Delphi ограничение доступа к полям объекта реализуется при помощи свойств объекта. Свойство объекта характеризуется полем, сохраняющим значение свойства, и двумя методами, обеспечивающими доступ к полю свойства. Метод установки значения свойства называется методом записи свойства (write), а метод получения значения свойства — методом чтения свойства (read). В описании класса перед именем свойства записывают слово property (свойство). После имени свойства указывается его тип, затем – имена методов, обеспечивающих доступ к значению свойства. После слова read указывается имя метода, обеспечивающего чтение свойства, после слова write – имя метода, отвечающего за запись свойства. Ниже приведен пример описания класса TPerson, содержащего два свойства: Name и Address.

type

   TName = string[15];

   TAddress = string[35];

   TPerson = class // класс 

       private

           FName: TName; // значение свойства Name

           FAddress: TAddress; // значение свойства Address 

           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;

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

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

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

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

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

В программе на методы свойства можно возложить некоторые дополнительные задачи. Например, с помощью метода можно проверить корректность присваиваемых свойству значений, установить значения других полей, логически связанных со свойством, вызвать вспомогательную процедуру. Оформление данных объекта как свойства позволяет ограничить доступ к полям, хранящим значения свойств объекта: например, можно разрешить только чтение. Для того чтобы инструкции программы не могли изменить значение свойства, в описании свойства надо указать лишь имя метода чтения. Попытка присвоить значение свойству, предназначенному только для чтения, вызывает ошибку времени компиляции. В приведенном выше описании класса TPerson свойство Name доступно только для чтения, а свойство Address – для чтения и записи. Установить значение свойства, защищенного от записи, можно во время инициализации объекта. Ниже приведены методы класса TPerson, обеспечивающие создание объекта класса TPerson и доступ к его свойствам.

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

Constructor TPerson.Create(Name:TName);

begin

   FName:=Name;

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;

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

student := TPerson.Create('Иванов');

student.Address := 'ул. Садовая, д.3, кв.25';

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

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

TEmployee = class(TPerson)

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

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

end;

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

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

begin

   inherited Create(Name);

   FDepartment:=Dep;

end;

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

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

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

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

Директивы protected и private

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

TPerson = class

   private

       FName: TName; // значение свойства Name

       FAddress: TAddress; // значение свойства Address

   protected

       Constructor Create(Name:TName);

       Function GetName: TName;

       Function GetAddress: TAddress;

       Procedure SetAddress(NewAddress:TAddress);

       Property Name: TName

           read GetName;

       Property Address: TAddress

           read GetAddress

           write SetAddress;

end;

Полиморфизм и виртуальные методы

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

tуре

   // базовый класс 

   TPerson = class

       fname: string; // имя

       constructor Create(name:string);

       function info: string; virtual;

    end;

   // производный от 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);

       function info: string; override;

end;

   В каждом из этих классов определен метод info. В базовом классе при помощи директивы virtual метод info объявлен виртуальным. Объявление метода виртуальным дает возможность дочернему классу произвести замену виртуального метода своим собственным. В каждом дочернем классе определен свой метод info, который замещает соответствующий метод родительского класса (метод порожденного класса, замещающий виртуальный метод родительского класса, помечается директивой override). Ниже приведено определение метода info для каждого класса.

function TPerson.info:string;

begin

   result := ' ';

end;

function TStud.info:string;

begin

   result := fname + ' гp.' + IntTostr(fgr);

end;

function TProf.info:string;

begin

   result := fname + ' каф.' + fdep;

end;

   Так как оба класса порождены от одного и того же базового, объявить список студентов и преподавателей можно так (здесь следует вспомнить, что объект – это указатель):

list: array[l..SZL] of TPerson;

   Объявить подобным образом список можно потому, что язык Delphi позволяет указателю на родительский класс присвоить значение указателя на дочерний класс. Поэтому элементами массива list могут быть как объекты класса TStud, так и объекты класса TProf. Вывести список студентов и преподавателей можно применением метода info к элементам массива. Например, так:

st := ' ';

for i:=l to SZL do // SZL - размер массива-списка 

   if   list[i] <> NIL then st := st + list[i].Info + #13;

ShowMessage (st);

   Во время работы программы каждый элемент массива может содержать как объект типа xstud, так и объект типа TProf. Концепция полиморфизма обеспечивает применение к объекту именно того метода, который соответствует типу объекта. Следующая программа, используя рассмотренные выше объявления классов TPerson, TStud и TProf, формирует и выводит список студентов и преподавателей.

Листинг. Демонстрация полиморфизма

unit polimor_;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

   TForm1 = class(TForm)

       Edit1: TEdit;

       Edit2: TEdit;

       GroupBoxl: TGroupBox;

       RadioButton1: TRadioButton;

       RadioButton2: TRadioButton;

       Label1: TLabel;

       Label2: TLabel;

       Button1: TButton;

       Button2: TButton;

       procedure ButtonlClick(Sender: TObject);

       procedure Button2Click(Sender: TObject);

private

   { Private declarations }

public

   { Public declarations }

end;

type

   // базовый класс

   TPerson = class

       fName: string; // имя

       constructor Create(name:string);

       function info:string; virtual;

   end;

   // класс Студент 

   TStud = class(TPerson)

       fGr:integer; // номер группы

       constructor Create(name:string;gr:integer);

       function info:string; override;

   end;

   // класс Преподаватель

   TProf = class (TPerson)

       fdep:string; // название кафедры

       constructor Create(name:string;dep:string);

       function info:string; override;

   end;

const

   SZL = 10; // размер списка

var

   Forml: TForm1;

   List: array[l..SZL] of TPerson; // список

   n:integer =0; // кол-во людей в списке

implementation

{$R *.DFM}

constructor TPerson.Create(name:string);

begin

   fName := name;

end;

constructor TStud.Create(name:string;gr:integer);

begin

   inherited create(name); // вызвать конструктор базового класса

   fGr := gr;

end;

constructor TProf.create(name:string; dep:string);

begin

   inherited create(name); // вызвать конструктор базового класса

   fDep := dep;

end;

function TPerson.Info:string;

begin

   result := fname;

end;

function TStud.Info:string;

begin

   result := fname + ' rp.' + IntToStr(fGr);

end;

function TProf.Info:string;

begin

   result := fname + ' каф.' + fDep;

end;

// щелчок на кнопке Добавить

procedure TForml.ButtonlClick(Sender: TObject);

begin

   if  n < SZL then

      begin

          // добавить объект в список

          n:=n+l;

          if Radiobuttonl.Checked then // создадим объект TStud

              List[n]:=TStud.Create(Edit1.Text,StrToInt(Edit2.Text))

           else // создать объект TProf

               List[n]:=TProf.Create(Edit1.Text,Edit2.Text);

           // очистить поля ввода 

           Edit1.Text := '' ; Edit2.Text := ' ';

           Edit1.SetFocus; // курсор в поле Фамилия

       end

   else ShowMessage('Список заполнен!');

end;

// щелчок на кнопке Список

procedure TForm1.Button2Click(Sender: TObject);

var

i:integer; // индекс

st:string; // список 

begin

   for i:=1 to SZL do

       if list[i] <> NIL then st:=st + list[i].info + #13;

   ShowMessage('Cпиcoк'+#13+st);

end;

end.

Процедура TForml.Buttoniciick, которая запускается нажатием кнопки Добавить (Buttonl), создает объект list[n] класса TStud или TProf. Класс создаваемого объекта определяется состоянием переключателя RadioButton. Установка переключателя в положение студент (RadioButtoni) определяет класс TStud, а в положение преподаватель (RadioButton2) – класс TProf.

Процедура TForm1.Button2Сlick, которая запускается нажатием кнопки Список (Button2), применяя метод info к каждому объекту списка (элементу массива), формирует строку, представляющую собой весь список.

Классы и объекты Delphi

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

type

   TForm1 = class(TForm)

   private

      { Private declarations }

   public

      { Public declarations }

   end; 

var

   Form1: Tform1

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

Контрольные вопросы

  1.  Понятие объектно-ориентированное программирование.
  2.  Понятие объект.
  3.  Понятие класс.
  4.  Какую роль играют методы класса?
  5.  Понятие инкапсуляции и свойства.
  6.  Понятие полиморфизма. Пример.

Резюме

  1.  Объектно-ориентированное программирование (ООП) – это методика разработки программ, в основе которой лежит понятие объект.
  2.  Объект – это некоторая структура, соответствующая объекту реального мира, его поведению. Задача, решаемая с использованием методики ООП, описывается в терминах объектов и операций над ними, а программа при таком подходе представляет собой набор объектов и связей между ними.
  3.  Класс – это сложная структура, включающая, помимо описания данных, описание процедур и функций, которые могут быть выполнены над представителем класса – объектом.
  4.  Методы класса (процедуры и функции, объявление которых включено в описание класса) выполняют действия над объектами класса. Для того чтобы метод был выполнен, необходимо указать имя объекта и имя метода, отделив одно имя от другого точкой.
  5.  Под инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса. В языке Delphi ограничение доступа к полям объекта реализуется при помощи свойств объекта. Свойство объекта характеризуется полем, сохраняющим значение свойства, и двумя методами, обеспечивающими доступ к полю свойства.
  6.  Полиморфизм – это возможность использовать одинаковые имена для методов, входящих в различные классы. Концепция полиморфизма обеспечивает в случае применения метода к объекту использование именно того метода, который соответствует классу объекта

Домашнее задание   

Выполнить примеры из лекций.

PAGE  141


 

А также другие работы, которые могут Вас заинтересовать

30519. Технологии обеспечения безопасности корпоративной сети с использованием оборудования 2-го уровня модели OSI 228.33 KB
  VLN Virtul Loclre Network это одна из функций Fst Ethernet. VLN позволяет изменять конфигурацию сети объединять пользователей в отдельные рабочие группы определять доступные сегменты для отдельно взятого порта. VLN дает возможность значительно оптимизировать работу локальной сети за счет разгрузки отдельных ее сегментов от лишнего трафика. С помощью VLN можно еще контролировать и эффективно подавлять широковещательные штормы которые в больших сетях иногда останавливают работу целых сегментов.
30520. Технологии обеспечения безопасности корпоративной сети с использованием оборудования 3-го уровня модели OSI 53.73 KB
  Метод анализа на лету заключается в мониторинге сетевого трафика в реальном или близком к реальному времени и использовании соответствующих алгоритмов обнаружения. Системы обнаружения атакIntrusion Detection Systems IDSs анализирует трафик поступающий на нее на соответствие сигнатурам в случае соответствия трафика сигнатуре оповещает администраторов по безопасности о наличии совпадения. Обычно на IDS поступает копия трафика который необходимо анализировать то есть IDS не ставят в разрез соединению это достигается...
30521. Средства обеспечения защиты данных от несанкционированного доступа, средства идентификации и аутентификации объектов БД, языковые средства разграничения доступа, организация аудита в системах БД. Задачи и средства администратора безопасности БД 32.18 KB
  В современных условиях любая деятельность сопряжена с оперированием большими объемами информации, которое производится широким кругом лиц. Защита данных от несанкционированного доступа является одной из приоритетных задач при проектировании любой информационной системы. Следствием возросшего в последнее время значения информации стали высокие требования к конфиденциальности данных. Системы управления базами данных, в особенности реляционные СУБД
30522. Основные понятия защиты информации (субъекты, объекты, доступ, граф доступов, информационные потоки). Постановка задачи построения защищенной автоматизированной системы (АС). Ценность информации 50.99 KB
  Ценность информации. Доска Пример матрицы доступа дискреционная модель защиты Выступление Основные понятия защиты информации. В связи с развивающимся процессом информатизации общества все большие объемы информации накапливаются хранятся и обрабатываются в автоматизированных системах построенных на основе современных средств вычислительной техники и связи.
30523. Модель системы безопасности HRU. Основные положения модели. Теорема об алгоритмической неразрешимости проблемы безопасности в произвольной системе 111.25 KB
  Теорема об алгоритмической неразрешимости проблемы безопасности в произвольной системе На доске множество исходных объектов O o1 o2 oM ; множество исходных субъектов S s1 s2 sN при этом S ⊆ O множество прав доступа субъектов к объектам R матрицей доступа каждая ячейка которой специфицирует права доступа к объектам из конечного набора прав доступа R r1 r2 rK т . Классическая Дискреционная модель реализует произвольное управление...
30524. Основні культурологічні теорії 143 KB
  Історичні науки вивчають процеси становлення і розвитку конкретних народів в їх безпосередній реальності, в хронологічній послідовності подій, вказуючи на конкретні форми міжрегіональної взаємодії.
30526. Модель Белла - Ла-Падулы 97 KB
  Устная часть Основным положением политики безопасности является назначение всем участникам процесса обработки защищаемой информации и документам в которых она содержится специальной метки секретно совершенно секретно и т. Такая метка называется уровнем безопасности. Все уровни безопасности упорядочиваются с помощью установленного отношения доминирования. Контроль доступа осуществляется в зависимости от уровней безопасности взаимодействующих сторон на основании двух правил: 1.
30527. Основные положения критериев TCSEC (“Оранжевая книга”). Фундаментальные требования компьютерной безопасности. Требования классов защиты 30.54 KB
  Фундаментальные требования компьютерной безопасности. Критерии оценки безопасности компьютерных систем TCSEC получившие неформальное Оранжевая книга были разработаны и опубликованы Министерством обороны США в 1983 г. с целью определения требований безопасности предъявляемых к аппаратному программному и специальному программному и информационному обеспечению компьютерных систем и выработки методологии и технологии анализа степени поддержки политики безопасности в компьютерных системах в основном военного назначения. Усиление требований...