скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Модули и объекты в языке Турбо Паскаль 7.0

            end;

В секции private могут находится и методы объекта.

Полное описание методов, то есть описание их реализации, должно находится после описания объекта. Имена методов составные и складываются из имени объекта и имени метода, разделённых точкой:

            procedure Location. Init (InitX, Inity: Integer);

            begin

                  X : = InitX;

                  Y : = InitY;

            end;

            fuction Location. GetX: Integer;

            begin

                   GetX : = X;

             end;

            fuction Location. GetY: Integer;

            begin

                   GetY : = Y;

             end;

После того как объект описан, в программе можно использовать его экземпляры, то есть переменные указанного объектного типа:

              var

                    GrMarket : Location;

2.1  Основные принципы ООП

Элементы объектно-ориентированного программирования появились в начале 70-х в языке моделирования Симула, затем получили своё развитие, и в настоящее время ООП принадлежит к числу ведущих технологий программирования. В Турбо Паскале поддержка этой технологии появилась, начиная с версии 5.5 (1989 год).

Основная цель ООП, как и большинства других подходов к программированию, - повышение эффективности разработки программ. Идеи ООП оказались плодотворными и нашли применение не только в языках программирования, но и в других областях Computer Science, например, в области разработки операционных систем.

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

Мы уже привыкли использовать в своих программах процедуры и функции для программирования тех сложных действий по обработке данных, которые приходится выполнять многократно. Использование подпрограмм в своё время было важным шагом на пути к увеличению эффективности программирования. Подпрограмма может иметь формальные параметры, которые при обращении к ней заменяются фактическими параметрами. В этом случае есть опасность вызова подпрограммы с неправильными данными, что может привести к сбою программы и её аварийному завершению  при выполнении. Поэтому естественным обобщением традиционного подхода к программированию является объединение данных и подпрограмм (процедур и функций), предназначенных для их обработки.

2.2  Инкапсуляция

В Турбо Паскале средства объектно-ориентированного программирования связаны с тремя зарезервированными словами: OBJECT CONSTRUCTOR и DESTRUCTOR и двумя стандартными директивами: PRIVATE и VIRTUAL. 

Зарезервированное слово OBJECT используется для описания объекта. Описание объекта должно помещаться в разделе описания типов, например:

type 
          Tpoint = object 
      X,Y: Integer;  {Координаты точки}
      Color:word; {Цвет точки) 
      Visible: Boolean; {Признак светимости} 
      Procedure Setlocation (NewX, NewY: integer);
           {Задает новое положение, точки на экране} 
      Procedure SetCoforfNewColor: word); {Устанавливает цвет точки}
      Procedure SetVislble(VIS: Boolean);
           {Выводит или гасит точку) 
      Procedure GetLocatIon(var Xloc, YLoc:integer);
           {Возвращает координаты точки}
      Function GetColor: word;
           {Возвращает цвет точки)
      Function GetVislble: Boolean;
           {Возвращает признак светимости точки} 
       end; {Конец описания объекта ТРOINT)

  В этом примере описывается объект TPOINT, представляющий собой данные и методы (процедуры и функции), необходимые для работы с графическими точками на экране ПК. Заметим, что инкапсулированные объект процедуры и функции называются методами. Как видим, каждая точка характеризуется некоторым набором данных (своими координатами X и У, цветом COLOR и признаком светимости VISIBLE). Над этими данными определены все необходимые алгоритмические действия. С помощью этих переменных можно осуществлять все предусмотренные, в объекте действия, например, для переменных типа TPOINT можно высветить или погасим, любую точку, переместить ее по экрану, изменить цвет.

Нетрудно заметить, что описание объекта и использование объектных переменных во многом похоже на описание и использование записей: инкапсулированные в объекте данные и методы становятся доступны с помощью оператора присоединения WITH или с помощью составных
имен, например:

if Point.GetVisible then Polnt.SetVisible(False);

При описании объекта вначале, описываются все инкапсулированные в нем данные, а затем - методы доступа к этим данным. В качестве методов используются процедуры и функции, а также конструкторы и деструкторы.

  Таким образом, указание методов при описании объекта подобно их опережающему описанию. Поскольку данные и методы инкапсулированы в одном объекте, все данные автоматически становятся глобальными, по отношению к любым методам и могут использоваться в них произвольным образом. Точнее говоря, любой метод объекта работает с невидимым оператором WITH, обеспечивающим ему доступ ко всем полям (как мы увидим далее, поля могут следовать в объявлении типа и после объявления метода и в этом смысле не являться для него глобальными). При обращении к методу ему передается особый идентификатор SELF, представляющий собой обобщенное имя экземпляра объекта.   Любой метод может использовать идентификатор SELF, чтобы явно указать на принадлежащий объекту метод или поле. Например:

type ТСоо = record
    X.Y: integer; 
end; 
    TPoint = object
    X,Y: integer;
Procedure lnit(Coo: TCoo);
end;
Procedure TPofntfCoo: TCoo):
begin
    with Coo do
    begin
         Self.X := X; 
         Self.Y := Y; 
    end;
end;


2.3  Наследование

Любой объект может быть объявлен потомком ранее описанного объекта. В этом случае он наследует все данные и методы объекта-родителя и может дополнять их своими данными и методами. При объявлении объекта-потомка за словом OBJECT в круглых скобках указывается имя объекта-родителя. У объекта может быть сколько угодно потомков, но только один родитель. При объявлении объекта-потомка TUNE перечислены лишь те данные и методы, которых недостает в объекте-родителе TPOINT, остальные TLINE автоматически наследует от своего родителя.

Таким образом, описание объекта-потомка TLINE эквивалентно такому описанию объекта TLINE_ANOTHER:

type

        TLine_Another = object

        X, Y Integer; {Координаты начала линии}

Color word; {Цвет линии)

Visible Boolean; (Признак светимости)

XE.YE: Integer; {Координаты второго конца)

Procedure SetLocation(NewX, NewY: integer);

{Задает новое положение начала линии)

Procedure SetColor(NewColor: word);

{Устанавливает цвет линии)

Procedure SetVIsible(Vis: Boolean);

{Выводит или гасит линию}

Procedure GetLocation(var XLoc, YLoc: integer);

{Возвращает координаты начала линии}

Function GetColor: word;

{возвращает цвет линии}

Function GetVisible: Boolean;

{Возвращает признак светимости линии}

Procedure SetLIneLocationfxl.X1,Y1,x2 ,y2: integer);

{Задает новое положение линии на экране}

Procedure GetLineLocatlon(var x11,y1l,x2l,y2l):integer);

{Возвращает координаты линии}

Procedure SetLineVJsible(vis: Boolean);

{Выводит или гасит линию)}

end; {Конец описания объекта TLIne_Another}

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

Наследование распространяется на любые объекты, в том числе и объекты-потомки: если в качестве родителя указано имя объекта, который сам по себе является потомком, новый объект наследует все свойства своего родителя и все свойства своих прародителей. Таким образом, наследование обеспечивает создание дерева родственных объектов.

Как и любое другое дерево, дерево объектов имеет «корень» - объект являющийся прародителем всех других объектов иерархии, и «ветви» порожденные от него потомки. По мере передвижения от корня к ветвям и перехода с ветви на ветвь объекты разрастаются в своих размерах, присоединяя к себе все новые и новые поля и методы. Если иерархия объектов хорошо продумана, на каждом ее уровне к объекту-родителю добавляются только необходимые поля и методы, поэтому в таком разрастании на самом деле нет ничего плохого. Более того, компоновщик Турбо Паскаля тщательно проверит откомпилированную программу и удалит из нее все лишнее - в том числе в исполняемую программу (ЕХЕ-файл) не будут включены методы, которые по каким-либо причинам не используются в программе.

Механизм наследования - это, пожалуй, самое мощное свойство ООП. Без наследования объекты превращаются в простую комбинацию данных и подпрограмм, не дающую качественных преимуществ по сравнению с традиционными для Паскаля процедурами и модулями. Наоборот, механизм наследования позволяет строить библиотеку по принципу «от простого - к сложному». Вводя с помощью наследования новый объект в свою библиотеку, программист в максимальной степени использует уже созданные (и, возможно, отлаженные) ранее объекты. Такой принцип конструирования программ называется восходящим программированием. В отличие от нисходящего программирования, он не дает возможности поэтапного создания программы. Мелкие детали реализации объектов заслоняют собою генеральный алгоритм, поэтому при использовании ООП рекомендуется сочетание подходов: методами нисходящего программирования генеральный алгоритм расчленяется на ряд относительно крупных и законченных в смысловом отношении фрагментов (модулей), а реализация этих фрагментов может основываться на объектно-ориентированном программировании.

2.4  Полиморфизм

Объект-потомок может не только дополнять поля и методы родителя, но и заменять методы родителя на новые (заменять поля родителя нельзя!). Например, вместо правила SETLINEVISIBLE мы могли бы в объекте TLINE объявить правило SETVISIBLE, которое в этом случае перекроет (заменит собой) одноименное правило объекта-родителя TPOINT. В результате, к разным родственным объектам TPOINT и TUNE можно было бы применять одноименные правила SETVISIBLE, обеспечивающие сходные в смысловом отношении действия - показать или сделать невидимым графический объект. Свойства, позволяющее называть разные алгоритмические действия одним именем, называется полиморфизмом.

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

Появление директивы VIRTUAL в объявлении метода как бы предупреждает компилятор: «Пока ты не знаешь, что я хочу. Придет время -запроси образец!». Встретившись с таким объявлением, компилятор не будет устанавливать связь объекта с методом. Вместо этого он создаст специальную таблицу, которая называется таблицей виртуальных методов (ТВМ). В этой таблице хранятся адреса точек входа всех виртуальных методов. Для каждого типа объекта создается своя ТВМ и каждый экземпляр объекта пользуется этой единственной для объектов данного типа таблицей. ТВМ обеспечивает работающую программу механизмом связывания объекта с полями. Фактическое связывание осуществляется с помощью обращения к конструктору - специальному методу, который во всем подобен обычной процедуре, но в заголовке вместо PROCEDURE содержит зарезервированное слово CONSTRUCTOR. В момент обращения к конструктору в специальное поле объекта заносится адрес нужной ТВМ, в результате чего все виртуальные методы (в том числе и унаследованные от родителей!) получают доступ к нужным полям.

Конструктор может не обращаться к виртуальному методу и даже вообще быть пустым, т.е. не иметь никаких исполняемых операторов (как в нашем примере), тем не менее, объект будет инициализирован правильно. Дело в том, что заголовок CONSTRUCTOR предписывает компилятору создать специальный набор машинных инструкций, который инициализирует ТВМ и исполняется в момент обращения к конструктору до выполнения его (конструктора) содержательной части. В объекте может быть сколько угодно конструкторов, но ни один из них не может быть виртуальным.

Выбор того, каким именно - статическим или виртуальным - должен быть метод, зависит от специфики задачи и Ваших вкусов. Однако следует помнить, что статический метод никогда не может быть перекрыт виртуальным и наоборот. Список формальных параметров статического метода может отличаться от списка в перекрываемом методе, а для виртуальных методов оба списка должны быть идентичны. И, наконец, виртуальные объекты занимают несколько большую память (за счет ТВМ) и вызов виртуальных методов исполняется чуть медленнее, чем вызов статических. Тем не менее, всегда, когда это возможно, следует отдавать предпочтение виртуальным методам, т.к. они придают программе дополнительную гибкость. Всегда может оказаться, что рано или поздно мы или кто-то из пользователей нашей библиотеки захочет модифицировать ту или иную ее функции. В этом случае перекрытие виртуальных методов позволит предельно упростить задачу. Отметим, что стандартная функция Турбо Паскаля TypeOf(TObj) возвращает ссылку на ТВМ для объекта типа TObj. Эту ссылку можно использовать, например, для проверки того, с каким именно объектом работает в данный момент виртуальный метод:

If TypeOf(Self) - TypeOf(TA) then ...

И еще одно замечание. Между экземплярами родственных объектов возможен обмен информацией с помощью операторов присваивания. Например, если PoinTl и Point2 - экземпляры объекта TPOINT, то допустимо присваивание 
             Point1 := Point2;

или 
             PoinT2 := Point1;

Присваивания разрешены и между экземплярами родственных объектов разных уровней иерархии, однако в этом случае экземпляру объекта-родителя можно присвоить экземпляр потомка, но не наоборот! Например, разрешается присваивание
             Point := Line;

но недопустимо

      Line := Point;

если LINE - потомок POINT. Это происходит по той причине, что потомок содержит все поля родителя, поэтому при присваивании потомка родителю эти поля получат правильные значения. Обратное же присваивание оставит без изменения «лишние» поля потомка, что является недопустимым.
При использовании виртуальных правил следует остерегаться присваивания между экземплярами объектов, во всяком случае, необходимо помнить, что простое присваивание не заменяет собой инициацию виртуального объекта. Если, например, LINE и POINT - виртуальные объекты, то присваивание
                 POINT:= Line;

не инициирует объект POINT, даже если объект LINE был перед этим инициирован. После такого присваивания необходим вызов конструктора объекта POINT перед обращением к любому виртуальному методу этого объекта.


Заключение

Мы завершаем рассмотрение основ программирования на Турбо Паскале. Среди них вычисления и обработка информации, использование объектно-ориентированного программирования – словом, те задачи, с которыми приходится сталкиваться профессиональному программисту. Турбо Паскаль был выбран как наилучший язык программирования для обучения основам профессионального программирования.

Турбо Паскаль – достаточно «старый» программный продукт. Следует заметить, однако, что Паскаль – это живой язык. Известны, используются или находятся в стадии разработки компиляторы и среды разработки программ на Паскале для различных операционных систем,  в том числе и бурно развивающейся операционной системы Linux. Эти системы иногда частично, а иногда и в значительной мере совместимы с Турбо Паскалем, а следовательно, накопленный опыт может быть использован и для серьезной, профессиональной работы по разработке программ.

Список используемых источников

1.   Абрамов В.Г., Трифонов Н.П., Трифонова Г.Н. Введение в язык Паскаль. - М.: Наука, 1988. - 320 с.

2.   Абрамов С.А., Зима Е.В. Начала программирования на языке Паскаль. - М.: Наука, 1987. - 112 с.

3.   Вирт Н. Алгоритмы и структуры данных./Пер. с англ. М.: Мир, 1989. - 360 с.

4.   Грогоно П. Программирование на языке Паскаль. - М.: Мир, 1982. - 382 с.

5.   Дантеманн Дж., Мишел Дж., Тейлор Д. Программирование в среде Delphi: Пер. с англ. - Киев: НИПФ “ДиаСофтЛтд.”, 1995. - 608 с.

6.   Епанешников А., Епанешников В. Программирование в среде Турбо Паскаль 7.0. - М.: ДИАЛОГ-МИФИ, 1993. - 288 с.

7.   Йенсен К., Вирт Н. Паскаль. Руководство для пользователя и описание языка: Пер. с англ. - М.: Финансы и статистика, 1982. - 151 с.

8.   Матчо Дж., Фолкнер Д.Р. Delphi: Пер.с англ.- М.: БИНОМ, 1995. - 464 с.

9.   Орлик С.В. Секреты Delphi на примерах: - М.: БИНОМ. - 316 с.

10.         Перминов О.Н. Программирование на языке Паскаль. - М.: Радио и связь, 1988. - 224 с.

11.         Пильшиков В.Н. Сборник упражнений по языку Паскаль: Учеб. пособие для вузов. - М.: Наука, 1989. - 160 с.

12.         Прайс Д. Программирование на языке Паскаль: Практ. руководство. - М.: Мир, 1987. - 232 с.

13.         Рубенкинг Н. Турбо Паскаль для Windows: В 2 т.; Пер. с англ. - М.: Мир, 1993. - 536 с.

14.         Фаронов В.В. Турбо Паскаль. В 3-х книгах. Книга 1. Основы Турбо Паскаля. - М.: Учеб.-инж.центр МВТУ-ФЕСТО ДИДАКТИК, 1992. - 304 с.

15.         Фаронов В.В. Паскаль и Windows. - М.: Учеб.-инж.центр МВТУ-ФЕСТО ДИДАКТИК, 1994. - 539 с.

16.         Фаронов В.В. Практика Windows-программирования. М.: Информпечать, 1996. - 247 с.

17.         Федоров А., Рогаткин Д. Borland Pascal в среде Windows. - Киев: Диалектика, 1993. - 656 с.

18.         Форсайт Р. Паскаль для всех: Пер. с англ.- М.: Машиностроение, 1986. - 288 с.

   Приложение А

(обязательное)

{$N+}

unit func1;

interface

type

       float = Extended;

const

       Infinity = 1.0E+4932;

function Tan(x : float) : float;

function ArcSin(x : float) : float;

function ArcCos(x : float) : float;

function Degrees_to_Radians(Degrees : float) : float;

function Radians_to_Degrees(Radians : float) : float;

function Sinh(x : float) : float;

function Cosh(x : float) : float;

function Tanh(x : float) : float;

function Log10(x : float) : float;

function Power(x, Exponent : float) : float;

implementation

const

       Radians_Per_Degree = Pi / 180;

       Degrees_Per_Radian = 180 / Pi;

       Ln10 = 2.3025850930;

       MaxValue = 88.029619;

function Tan(x : float) : Float;

var

       Consine, Tangent : float;

begin

       Consine := Cos(x);

       if Cosine := 0.0 then

                if Sin(x)>=0 then

                          Tan := Infinity

                else

                          Tan := -Infinity

       else

       begin

                Tangent := Sin(x) / Cosine;

                if Tangent > Infinity then

                          Tan := Infinity

       else

                if Tangent < -Infinity then

                          Tan := -Infinity

                else

                          Tan := Tangent;

       end;

end;

function ArcSin(x : float) : float;

begin

       if Abs(x) = 1.0 then

          ArcSin := Pi / 2.0         

       else

          ArcSin := ArcTan(x / Sqrt(1 – x * x));

end;

function ArcCos(x : float) : float;

var

       Result : float;

begin

       if x = 0.0 then

                ArcCos := Pi / 2.0

       else

       begin

                Result := ArcTan(sqrt(1 – x * x) / x);

                if x < 0.0 then

                          ArcCos := Result + Pi

                else

                          ArcCos := Result;

       end;

end;

function Degrees_to_Radians(Degrees : float) : float;

begin

       Degrees_to_Radians := Degrees * Radians_Per_Degree;

end;

function Radians_to_Degrees(Radians : float) : float;

begin

       Radians_to_Degrees := Radians * Degrees_Per_Radian;

end;

function Sinh(x : float) : float;

var

       t : float;

begin

       if x > MaxValue then

                Sinh := Ifinity

       else

                if x < -MaxValue then

                          Sinh := -Infinity

                else

                begin

                          t := Exp(x);

                          Sinh := 0.5 * (t – 1 / t);

                end;  

end;

function Cosh(x : float) : float;

var

       t : float;

begin

       if Abs(x) > MaxValue then

            Cosh := Infinity

       else

       begin

                t :=  Exp(x);

                Cosh :=  0.5 * (t + 1 / t);

       end;

end;

function Tanh(x : float) : float;

begin

       Tanh := Sinh(x) / Cosh(x);

end;

function Log10(x : float) : float;

begin

       Log10 := Ln(x) / Ln10;

end;

function Power(x, Exponent : float) : float;

begin

       if x > 0.0 then

                Power := Exp(Exponent * Ln(x))

       else if x = 0.0 then

                          Power := 0.0

                else

                          WriteLn ( ‘ Основание степени отрицательно! ’ );

end;

begin

end.


Страницы: 1, 2, 3


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.