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.

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

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


 

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

73894. Ионная упругая поляризация 34.66 KB
  Но во внешнем электрическом поле катионы т анионы смещаются под действием кулоновских сил создавая полярную решетку с элементарными электрическими моментами. Если приложить электрическое поле то к упругой энергии заряженных частиц добавляется энергия накопленная ими в поле...
73895. Электронная тепловая поляризация 123.69 KB
  Тензоры упругости и податливости Приложенные извне механические напряжения Х упруго и обратимо изменяют форму кристалла – происходит его деформация х. Поскольку xmn и Xmn – тензоры второго ранга в анизотропных кристаллах или текстурах можно ожидать что каждая из девяти компонентов деформаций xkp индуктирована девятью компонентами тензора напряжения...
73896. Виникнення класичної буржуазної політичної економії в Англії. 32.5 KB
  Петті Уільям Петті 1623 1687 основоположник класичної політичної економії в Англії. Петті є неоднозначною. У своїх працях особливо ранніх Петті віддає данину меркантилізму. Отже на відміну від меркантилістів які використовували емпіричний описовий метод Петті заклав основи абстрактного методу в політичній економії.
73897. Зародження і проблеми суперечливого розвитку класичної буржуазії політекономії у Франції. 29.5 KB
  Буагільбер У XVII ст. П’єр де Буагільбер 1646 1714 засновник класичної політичної економії у Франції народився в Руані в дворянській сім'ї здобув гарну освіту займався певний час літературною діяльністю потім юриспруденцією. Особливості економічного розвитку Франції позначилися на формуванні економічних поглядів Буагільбера. 1696 Роздрібна торгівля Франції 1699 Міркування про природу багатства грошей і податків 1707 та інших Буагільбер виступає з гострою критикою меркантилізму.
73898. Виникнення політичної економії в Німеччині. Ф. Ліст, “Стара і нова” історичні школи В. Рошер, К. Кніс, Б. Гільдебранд, Г. Шмолер, В. Зомбард, Брентано 50.5 KB
  Німеччина XIX ст. — це країна, що складалася з політично й економічно відособлених держав, обєднаних у конфедерацію за національною ознакою. їхня економічна відособленість базувалась на феодальних відносинах
73899. Економічна думка Давньої Греції. 34.5 KB
  Проте Ксенофонт як захисник натурального господарства все ж помітив зрослий поділ праці в суспільстві хоча й заперечував об'єктивний недолік який випливав звідси потребу розгортання товарногрошових відносин. Зрівняльний розподіл у філософів та воїнів поєднувався з широким розподілом праці між всіма громадянами. Численні його праці охоплюють найрізноманітніші галузі знання: логіку психологію риторику етику поетику економіку фізику зоологію. Серед визначних його відкриттів у галузі економіки аналіз розвитку форм вартості в...
73900. Начала політичної економії та оподаткування 33 KB
  Давід Рікардо 17721823 рр. Рікардо покладена теорія вартості визначення вартості товару робочим часом. Рікардо і проблему усереднення прибутку та впливу застосованого капіталу на ціноутворення. Рікардо є те що він як і багато його попередників ототожнював робочу силу як товар з його функцією працею.
73901. Економічна думка в Україні в демографічний період 19 століття 45 KB
  Загострення кризи кріпосницької системи зростання селянських заворушень стали поштовхом для розвитку антикріпосницького руху. Значна частина членів товариства яка стояла на ліберальних позиціях заперечувала революційну боротьбу і виступала за еволюційний шлях розвитку. Каразін розробляє проекти господарського розвитку країни в цілому. Каразін прихильник розвитку різних галузей вітчизняної промисловості він закликає дворян організовувати промислові підприємства та сприяє наданню їм фінансової допомоги.
73902. Электроника, конспект лекций. Усилители 8.76 MB
  Загострення кризи кріпосницької системи зростання селянських заворушень стали поштовхом для розвитку антикріпосницького руху. Значна частина членів товариства яка стояла на ліберальних позиціях заперечувала революційну боротьбу і виступала за еволюційний шлях розвитку. Каразін розробляє проекти господарського розвитку країни в цілому. Каразін прихильник розвитку різних галузей вітчизняної промисловості він закликає дворян організовувати промислові підприємства та сприяє наданню їм фінансової допомоги.