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.

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

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


 

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

51548. Клімат . 8 клас 337 KB
  Красоткіна Е 6 Відповіді: А 6 циклон Б В Г Д Е Завдання №2. Красоткіна А 1 Все зацвілопора натхненна Така чарівна у природі мить Убрались в зелень явори і клени І в світллі сонця річечка блищить. Красоткіна Б 2 Пора летить бентежна ніжна У квітах росах чарівна. Красоткіна...
51549. Знайомство з країною Фантазією 40.5 KB
  Обладнання: альбом плакат із зображенням замку малюнок Королеви кольорові олівці фломастери клубок ниток для гри фотографії дітей яблуко гриб шматочки льоду. Як ви думаєте де живе Королева Звичайно у замку. На дошці – плакат із зображенням замку. Яку гарну країну ми створили який чудовий замок збудували А про господиню Королеву замку забули Тож давайте познайомимось із нею ближче.
51550. Дослідження роботи напівпровідникових діодів 84 KB
  Перед початком роботи необхідно: перевірити наявність та надійність захисного заземлення устаткування; перевірити стан електричного шнура та вилки; перевірити справність вимикачів та інших органів управління ПЕОМ;
51552. В рідній школі – рідне слово 430 KB
  Вірші українських поетів. Для їх проведення складені картки для вчителя і для учнів Вірші для вчителя Вірші для учнів де розміщені уривки з різних віршів відповідно розділам і тематики підручника. Етапи роботи Пропонуємо учням ознайомитися з карткою віршів. Особливо добре зустрічають учні знайомі вірші які вони читали чи вчили раніше.
51554. Сценарий нового года для 5-11 классов 67 KB
  Галя: да ничего а где Маша Саша: она пошла папу и Николая Олександровича искать. после этого идет погода потихоньку все уходят первыми уходят Коля и Петр потом Маша и Саша остаются только Галя и Таня они с удивлением смотрят погоду Погода: Я Дмитрий Джуджула и прогноз погоды на завтра я расскажу вам какими будут температура и ветер внимательно послушайте что вам следует что бы у вас самих не было высокой температуры и ветров:1 гидрамикробинзофикат калия если у вас сильный кашель температура сорок и вам за семьдесят то...
51556. Программные средства учебного назначения и тенденции их развития 55.5 KB
  Демонстрационные программы предназначены для обучения теоретическому материалу. Контролирующие программы Эти программы можно использовать в любой дисциплине при сходном рубежном или итоговом контроле знаний. Обучающие программы Программы данного типа особенно эффективны когда изучаемый материал можно разбить на небольшие порции поддающихся контролю. Профессиональные программы Эти программы применяются для предоставления учащимся самостоятельной уч.