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.

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

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


 

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

83643. Линия без искажений 208 KB
  Таким образом для отсутствия искажений что очень важно например в линиях передачи информации необходимо чтобы все гармоники распространялись с одинаковой скоростью и одинаковым затуханием поскольку только в этом случае сложившись они образуют в конце линии сигнал подобный входному. Однако искажения могут отсутствовать и в линии с потерями. Фазовая скорость для такой линии и затухание .
83644. Входное сопротивление длинной линии 156 KB
  В общем случае для линии с произвольной нагрузкой для входного сопротивления можно записать. Полученное выражение показывает что входное сопротивление является функцией параметров линии и ее длины и нагрузки. При этом зависимость входного сопротивления от длины линии т.
83645. Сведение расчета переходных процессов в цепях с распределенными параметрами к нулевым начальным условиям 149 KB
  Таким образом если к линии в общем случае заряженной подключается некоторый в общем случае активный двухполюсник то для нахождения возникающих волн необходимо определить напряжение на разомкнутых контактах ключа рубильника после чего рассчитать токи и напряжения в схеме с сосредоточенными параметрами включаемой на это напряжение при нулевых начальных условиях. Полученные напряжения и токи накладываются на соответствующие величины предыдущего режима. При отключении нагрузки или участков линии для расчета возникающих волн напряжения и...
83646. ЭЛЕКТРИЧЕСКИЕ ЦЕПИ ПОСТОЯННОГО ТОКА 122.5 KB
  Эрстедом влияния электрического тока на магнитную стрелку. Омом было найдено соотношение между силой тока электродвижущей силой источника энергии и сопротивлением проводника по которому проходит ток т. Создателем техники трехфазного тока является русский ученый М. Им создан первый асинхронный двигатель с ротором типа беличье колесо 1889 первый трехфазный генератор переменного тока 1888.
83650. Элементы электрических цепей 156 KB
  Электротехнические устройства производящие электрическую энергию называются генераторами или источниками электрической энергии а устройства потребляющие ее приемниками потребителями электрической энергии. Схемы замещения источников электрической энергии Свойства источника электрической энергии описываются ВАХ называемой внешней характеристикой источника. ВАХ источника может быть определена экспериментально на основе схемы представленной на рис. Здесь вольтметр V измеряет напряжение на зажимах 12 источника И а амперметр А ...
83651. Топология электрической цепи 169.5 KB
  Отрезок линии соответствующий ветви схемы называется ветвью графа. Граничные точки ветви графа называют узлами графа. Ветвям графа может быть дана определенная ориентация указанная стрелкой. Подграфом графа называется часть графа т.