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.

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

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


 

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

4244. Трансгрессии. Влияние одного гена на проявление ряда других генов 246 KB
  Трансгрессии Сущность явления состоит в том, что при скрещивании при анализе наследования количественного признака (например, окраски эндосперма) у потомков он оказывается более или менее выраженным, чем родительские формы. Например, при скре...
4245. Управление качеством. Сущность управления качеством 90 KB
  Управление качеством. Сущность управления качеством Объективные предпосылки изменения отношения к качеству и эволюция управления качеством. Экономические категории и затратный механизм качества. Качество как фактор конкурентоспособности. Проце...
4246. Аудит як форма фінансового контролю та складова адміністративно-правової інфраструктури детінізації економічних відносин в Україні 1.15 MB
  Аудит як форма фінансового контролю та складова адміністративно-правової інфраструктури детінізації економічних відносин в Україні Актуальність теми дослідження. Трансформаційний стан економічних відносин в Україні характеризується рядом кільк...
4247. Функції. Багатовимірні масиви 30.63 KB
  Тема: Функції. Багатовимірні масиви. Мета: навчитись проводити обробку багатовимірних масивів та рядків мовою програмування С. Завдання Написати функцію, що повертає номер матриці тривимірного масиву, яка містить найбільший елемент. Програма...
4248. Функції. Багатовимірні масиви. Обробка двовимірних масивів 102.75 KB
  Функції. Багатовимірні масиви. Обробка двовимірних масивів. Мета: навчитись проводити обробку одновимірних масивів та рядків мовою програмування С. Завдання Дано матрицю 9х9. Зробити її дзеркальне відображення відносно головної діагоналі. Програма...
4249. Статичні одновимірні масиви. Оператори роботи з рядками. Обробка одновимірних масивів та рядків 414.18 KB
  Оператори роботи з рядками. Обробка одновимірних масивів та рядків. Мета: навчитись проводити обробку одновимірних масивів та рядків мовою програмування С. Завдання 1. Задано рядок. Перевірити чи він складається із підряд...
4250. Статичні одновимірні масиви. Оператори роботи з рядками. Обробка одновимірних масивів та рядків. Практична робота 141.61 KB
  Статичні одновимірні масиви. Оператори роботи з рядками. Обробка одновимірних масивів та рядків. Мета: навчитись проводити обробку одновимірних масивів та рядків мовою програмування С. Завдання 1. Задано цілочисельний масив розміру N. Назвемо серією...
4251. Оператори циклу. Програмування циклічних алгоритмів 130.19 KB
  Оператори циклу. Програмування циклічних алгоритмів. Мета: навчитись програмувати циклічні алгоритми з використанням операторів циклу з параметром, перед- та післяумовою мовою програмування С. Завдання 1. Скласти програму табулювання функції y=f(x) ...
4252. Учебно-методическое пособие по курсу экономико-математические методы и модели. Линейное программирование 1.17 MB
  В учебно-методическом пособии рассмотрены вопросы построения математических моделей основных типов задач линейного программирования и способы их решения средствами табличного редактора Microsoft Excel, приведены примеры решения или рекомендации к ре...