34668

Объектно-ориентированное программирование. Виртуальные методы и полиморфизм

Реферат

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

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

Русский

2015-01-19

71.5 KB

10 чел.

исциплина «Основы алгоритмизации и программирование»  Объектно-ориентированное программирование

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

[1] 1. История объектно-ориентированного программирования

[2] 2. Общие понятия

[3] 3. Инкапсуляция

[4] 4. Наследование

[5] 5. Виртуальные методы и полиморфизм

[6] ЛИТЕРАТУРА

1. История объектно-ориентированного программирования

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

Первым языком программирования, в котором были предложены принципы объектной ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования.

В настоящее время количество прикладных языков программирования (список языков), реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам. В области системного программирования до сих пор применяется парадигма процедурного программирования, и общепринятым языком программирования является язык C. Хотя при взаимодействии системного и прикладного уровней операционных систем заметное влияние стали оказывать языки объектно-ориентированного программирования. Например, одной из наиболее распространенных библиотек мультиплатформенного программирования является объектно-ориентированная библиотека Qt, написанная на языке C++.

2. Общие понятия

На программу можно смотреть как на модель некоторой части реального или воображаемого мира. Реальный мир полнокровно можно представить в образах взаимодействующих программных объектов. Именно такой подход и реализуется в объектно-ориентированном программировании (ООП). Рассмотрим каким образом представляются объекты в современных языках программирования на примере программы, в которой вводится понятие "Банковский счёт".

program Account1;

type

CAccount = object

  fNumber:  Integer;

  fBalance: Integer;

  procedure Deposit(amount: Integer);

  procedure Withdraw(amount: Integer);

end;

var a: CAccount;

procedure CAccount.Deposit(amount: Integer);

begin

 fBalance := fBalance + amount

end;

procedure CAccount.Withdraw(amount: Integer);

begin

  fBalance := fBalance - amount

end;

begin

 a.fNumber := 5;

 a.fBalance := 0; {Инициализация объекта}

 a.Deposit(100);                  {Положить на счёт 100$}

 a.Withdraw(75);                  {Снять со счёта 75$}

 a.Withdraw(50);                  {И ещё снять 50$}

 WriteLn('Account # ',a.fNumber,': balance is ',a.fBalance,'$.');

end.

В программе понятие "Банковский счёт" вводится с помощью описания типа CAccount, которое начинается ключевым словом object и заканчивается ключевым словом end. Это и есть описание класса, которое по виду напоминает описание записи, но кроме полей ещё и содержит заголовки процедур. Эти процедуры - их принято называть методами - определяют операции, которые можно выполнять с объектами данного типа. В этой связи принято считать, что поля выражают внутреннее состояние объекта, а методы - его поведение, суть которого состоит в изменении внутреннего состояния объекта.

В примере определён класс с двумя полями - fNumber ("номер счёта") и fBalance ("сумма на счёте"), и с двумя методами - Deposit ("положить на счёт") и Withdraw ("снять со счёта"). Переменная a - это объект класса CAccount.

3. Инкапсуляция

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

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

unit Account;

interface

type

 TpCAccount = ^CAccount;

 CAccount = object

   fNumber:  Integer;

   fBalance: Integer;

   constructor Init(number: Integer);

   function getBalance: Integer;

   function Deposit(amount: Integer): Integer;

   function Withdraw(amount: Integer): Integer;

   procedure printAccount;

 end;

implementation

constructor CAccount.Init(number: Integer);

begin

 fNumber := number;

 fBalance := 0;

end;

function CAccount.getBalance: Integer;

begin

 getBalance := fBalance;

end;

function CAccount.Deposit(amount: Integer): Integer;

begin

 if amount <= 0 then begin Deposit := -1; Exit end;

 fBalance := fBalance + amount;

 Deposit := fBalance;

end;

function CAccount.Withdraw(amount: Integer): Integer;

begin

 if (amount <= 0) or (amount > fBalance) then

 begin 

   Withdraw := -1;

   Exit

 end;

 fBalance := fBalance - amount;

 Withdraw := fBalance;

end;

procedure CAccount.printAccount;

begin

 WriteLn('Account # ', fNumber, ': balance is ', fBalance, '$.');

end;

end.

Вызов методов Deposit и Withdraw может означать попытку перевода объекта в неправильное состояние, то в этих случаях самим кодом этих методов предусмотрена блокировка изменения его состояния с возвратом кода завершения -1.

Новое ключевое слово constructor используется для описания особых методов, которые используются для инициализации объекта после его создания. Конструктор не возвращает никакого значения. В некоторых случаях возникает необходимость в выполнении особых методов и непосредственно перед удалением объекта - для описания таких методов введено ключевое слово destructor. Деструктор не имеет параметров и тоже не возвращает никакого значения. Особое значение конструкторы и деструкторы приобретают при динамическом выделении памяти для объектов и её освобождении с помощью стандартных прцедур new и dispose.

Тип  TpCAccount определён для удобства работы с объектами класса CAccount в случае их размещения в динамической памяти.

Программа иллюстрирует использование модуля Account и предоставляет возможности для тестирования описанного в нём класса CAccount.

program Account2;

uses Account;

var a:      CAccount;

   Amount: Integer;

   Rest:   Integer;

   OpCode: Char;

begin

 a.Init(7);

 WriteLn;

 WriteLn('OpCodes: d - Deposit, w - Withdraw, g - getBalance, e - Exit.');

 repeat

   Write('Enter OpCode & Amount: ');

   Read(OpCode);

   if OpCode = 'e' then Exit;

   if OpCode in ['d','w'] then Read(Amount);

   ReadLn;

   case OpCode of

   'd': Rest := a.Deposit(Amount);

   'w': Rest := a.Withdraw(Amount);

   'g': Rest := a.getBalance;

   end;

   Write('  Rest = ',Rest);

   if Rest < 0 then Write(':   Wrong operation!');

   WriteLn;

   Write('  ');

   a.printAccount;

 until False;

end.

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

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

Предположим, что банк решил ввести новый вид счетов, которые отличаются от старых тем, что на них можно положить сумму только однократно. Совершенно ясно, что нет никакой необходимости создавать для этого новый класс с нуля - достаточно слегка "подправить" уже существующий. Пусть имя нового класса будет CmAccount. Его описание поместим в модуль mAccount.

unit mAccount;

interface

uses Account;

type

 TpCmAccount = ^CmAccount;

 CmAccount = object(CAccount)

   fPut: Boolean;

   constructor Init(number: Integer);

   function Deposit(amount: Integer): Integer;

   function Withdraw(amount: Integer): Integer;

   procedure printAccount;

 end;

implementation

constructor CmAccount.Init(number: Integer);

begin

 fPut := False; CAccount(number);

end;

function CmAccount.Deposit(amount: Integer): Integer;

var Res: Integer;

begin

 if fPut then begin Deposit := -1; Exit end;

 Res := CAccount.Deposit(amount);

 if Res > 0 then fPut := True;

 Deposit := Res;

end;

function CmAccount.Withdraw(amount: Integer): Integer;

begin

 if not fPut or (fBalance <> amount) then

 begin 

   Withdraw := -1;

   Exit

 end;

 fBalance := 0;

 Withdraw := fBalance;

end;

procedure CmAccount.printAccount;

begin 

 Write('m'); CAccount.printAccount

end;

end.

Обратите внимание на то, что имя базового класса указывается в скобках сразу за ключевым словом object. В новом классе определено дополнительное поле fPut, в котором отмечается факт того, что на счёт положена какая-то сумма. Имена новых методов могут совпадать со старыми - в этом случае они перекрывают их, а это означает, что эти методы для нового класса приобретают другой смысл.

5. Виртуальные методы и полиморфизм

Чтобы метод стал виртуальным достаточно после его заголовка в описании класса записать ключевое слово virtual.

Совокупность методов класса образует его интерфейс. В нашем примере классы CAccount и CmAccount имеют   одинаковые интерфейсы. Это, конечно, в общем случае не обязательно, но в данном случае сделано совершенно сознательно для того, чтобы продемонстрировать ещё одно понятие ООП - полиморфизм. Полиморфизм даёт возможность одинаковым образом "управлять" объектами разных классов. Именно полиморфизм обеспечивает в конечном итоге значительную долю преимуществ ООП! Полиморфизм позволяет программисту абстрагироваться от многочисленных нюансов поведения объектов разных классов и это существенно упрощает создание программы.

ЛИТЕРАТУРА

  1.  Прикладная информатика: Учеб. пособие. А.Н. Морозевич, 2003.
  2.  Turbo Pascal 7.0 для студентов и школьников. Наука и Техника, 2007.

Разработал
Преподаватель: Скуловец А.П.

Рассмотрено и утверждено
на заседании методической комиссии
информационных технологий.


 

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

5675. Теорія алгоритмів і основи представлення знань 339 KB
  Вступ. Інтуїтивне поняття алгоритму. Поняття алгоритму інтуїтивно зрозуміло і часто використовується в математиці. Додавання і множення чисел стовпчиком, що відомо ще зі школи, формула обчислення коренів квадратного рівняння,...
5676. Економіка підприємств. Курс лекцій 1.59 MB
  Підприємство як суб'єкт господарювання Введення, предмет та завдання дисципліни. Галузева структура народного господарства України. Загальна характеристика підприємств. Структура управління підприємством. Зовнішнє середовищ...
5677. Економічна теорія (Економіка). Конспект лекцій 1.06 MB
  Загальні основи економічної теорії Тема 1.1 Економічна теорія: предмет і методи пізнання 1. Поняття економіки як системи економічних знань. Обмеженість ресурсів та безмежність потреб. Предмет курсу економічної теорії. Мета і функції економі...
5678. Історія економіки та економічної думки. Предмет і метод історії економіки та економічної думки 1.3 MB
  Предмет і метод історії економіки та економічної думки Поява історії економіки та економічної думки як самостійної учбової дисципліни в учбових планах і програмах провідних вузів України та країн Західної Європи було обумовлено необхідністю...
5679. Психологія. Конспект лекцій. Предмет і методи психології 273.5 KB
  Передмова Курс Психологія являє собою складову частину загальногуманітарної підготовки студентів. Психологія - одна з найцікавіших у світі наук. Саме психологія дає змогу відшукати відповіді на життєво важливі питання: як і чому люди думають,...
5680. Релігієзнавство. Курс лекцій. Релігія та суспільство 85.25 KB
  Лекція 1. Релігія та суспільство Поняття та сутність релігії: а) богословсько-теологічне дослідження релігії б) філософський аналіз релігії в) наукові теорії дослідження релігії. Виникнення релігії: а) формування релігійних уявле...
5681. Охорона праці в галузі. Конспект лекцій 636.5 KB
  Основні поняття організації охорони праці в галузі Виробниче середовище - частина техносферы, що володіє підвищеною концентрацією негативних чинників. Основними носіями травмуючих і шкідливих чинників у виробничому середовищі є машини і т...
5682. Основи замлевпорядкування та кадастру. Курс лекцій 2.09 MB
  Нормативно-правові основи землевпорядкування та кадастру Нормативно-правове підгрунтя в системі землевпорядкування та кадастру за нормами міжнародного права Національна система законодавства в галузі землевпорядкування та ...
5683. Інформаційно-аналітична діяльність. Наукова обробка документів 677.5 KB
  Обсяг і зміст матеріалу, що увійшов до конспекту лекцій відповідають вимогам робочої програми з дисципліни Інформаційнно - аналітична діяльність. Конспект лекцій містить мету і завдання дисципліни, програму курсу. У кінці конспекту лекцій пода...