Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Виды методов классов. Создание и удаление объектов. Размещение данных объектов в памяти.
Реализация методов После того как в модуле описан новый класс, в нижеследующей части исходного текста необходимо описать реализацию всех его методов (если они есть). Чтобы компилятор понял, к какому классу относится конкретная подпрограмма, перед ее названием указывается имя соответствующего класса и точка: function TMyClass.GetCount: Integer; Begin Result:= Count end; Заголовок подпрограммы должен в точности соответствовать заголовку, указан- ному в описании класса. Типы методов В Паскале каждый метод класса может иметь дополнительные характеристики, определяющие, как будет реализовываться этот метод в классах-наследниках. Статические методы Все методы по умолчанию считаются статическими. Это означает, что их вызов будет происходить в соответствии с принципом полиморфизма. Например, описаны два класса. type TCar = class(TObect] procedure Move; end; TMAZ = class(TCar) procedure Move; end; var Car: TCar; MAZ: TMAZ; Begin MAZ:= TMAZ.Create; Car:= TCar.Create; MAZ.Move; // вызовется метод Move класса TMAZ Car.Move; // вызовется метод Move класса TCar Однако переменную Car можно инициализировать объектом типа TMAZ: Car. Free,- Car:= TMAZ.Create; Если теперь обратиться к методу Move: 92 Урок 5. Язык Delphi (Object Pascal) и его использование Car.Move; то вызовется метод TCar.Move, так как переменная Саг, реально храня экземпляр класса TMAZ, описана как ТСаг. Обращаться к методам и полям переменной Саг, как к методам и полям типа TMAZ, можно, только явно выполнив приведение типа: TMAZ(Car). Об этом рассказывалось при описании оператора присваивания: TMAZ(Car].Move; При этом вызовется метод Move, относящийся к классу TMAZ. Если при вызове метода Move класса TMAZ необходимо предварительно вызвать роди- тельский метод, выполняющий общие для всех автомобилей действия, в реализации метода Move надо указать этот вызов с помощью ключевого слова inherited. procedure TMAZ.Move,- begin inherited Move,- end; Виртуальные и динамические методы Статические _____методы удобны, когда в программе заранее известно, какие типы объектов будут использоваться, и приведения типов, как правило, не требуется. Б ряде случаев, особенно в крупных проектах, часто приходится хранить в перемен- ных объекты-наследники (как в примере с ТСаг и TMAZ), причем конкретный тип этих объектов может быть неизвестен. Поэтому в Паскале реализован новый тип
методов — виртуальные методы (для их описания существует зарезервированное слово virtual). Описать виртуальный метод можно так. type TCar = class(TObect) procedure Move; virtual; end; Перегружаемые методы Ранее рассматривались перегружаемые подпрограммы, имеющие одинаковые имена, но различные типы параметров. Компилятор автоматически определяет, какую кон- кретно подпрограмму надо вызывать в зависимости от типов ее аргументов. Имеется в Паскале аналогичная возможность и для методов. type Tl ~ class(TObject) procedure Sum(X,Y: Integer); overload; end; type T2 = class(Tl) procedure SumfX,Y: Real]; overload; end; var CT: T2,- CT:= T2. Create; CT.Sum(2,2); // вызывается Tl.Sum() CT.Sum(2.0,2.0); // вызывается T2.Sum() Перегружаемым может быть и виртуальный метод. Чтобы у компилятора не воз- никало претензий к программисту по поводу несоответствия заголовков перегружа- 94 Урок 1: Язык Delphi (Object Pascal) него использование емых виртуальных методов, в наследуемом методе надо дополнительно указать ключевое слово reintroduce: type Tl = class(TObjecti procedure Sum(X,Y: Integer); overload; virtual; end; type T2 = class(Tl) procedure Sura(X,Y: Real); reintroduce; overload; end,- Создание и удаление объекта Помимо обычных методов, в Паскале имеются так называемые методы классов. Их особенность заключается в том, что методы классов разрешается вызывать, используя для этого вызова не объект, а класс. Это означает, что подобные методы не 90 Урок 1. Язык Delphi (Objecl Pascal) и его использование могут обращаться к полям класса — ведь поля существуют, только когда существует объект (экземпляр класса), а методы в виде программного кода, созданного на этапе компиляции, присутствуют в памяти компьютера постоянно. Однако вызывать таким образом можно только методы, описанные с помощью ключевого слова class, указываемого перед заголовком ] Lсопрограммы. Это нужно, чтобы компилятор проверил, насколько корректно реализован соответствующий метод, в частности, не происходит ли в нем обращения к полям и свойствам класса. type TMyClass = class Item.: integer; public class function Sozdanie: integer; end; В заголовке реализации функции Sozdanie также надо указать ключевое слово class: class function TMyClass.Sozdanie: integer; Begin end; Так как методы классов не привязаны к объектам, то их можно вызывать, указы-
вая название класса, а не объекта: N:= TMyClass.Sozdanie; Это одна из фундаментальных возможностей Паскаля, благодаря которой можно, в частности, динамически (во время работы программы) ____________создавать объекты и запи- сывать ссылки на них в переменные. Данный подход активно используется для задания переменным-классам начальных значений. У базового класса TObject име- ется метод Create (в реальности это конструктор, выполняющий вес необходимые действия по запросу памяти и начальной инициализаций), который практически всегда применяется при создании объектов. var MyClass: TMyClass; MyClags:= TMyClass.Create; Это стандартный способ создания объектов и инициализации указывающих на них переменных. Пока таким способом и переменную не записан указатель на объект, обращаться к этой переменной нельзя. Когда работа с объектом полностью закончена, занятую им намять необходимо освободить. Для этого существует специальный метод Free, который уничтожает объект, автоматически вызывая его деструктор, MyClass.Free; Методы Процедуры и функции, предназначенные для выполнения над объектами действий, называются методами. Предварительное объявление методов выполняется при описании класса в секции interface модуля, а их программный код записывается в секции implementation. Однако в отличие от обычных процедур и функций заголовки методов должны иметь уточненные имена, т.е. содержать наименование класса. Приведем возможную реализацию одного из методов в классе TDelimitedReader:
Обратите внимание, что внутри методов обращения к полям и другим методам выполняются как к обычным переменным и подпрограммам без уточнения экземпляра объекта. Такое упрощение достигается путем использования в пределах метода псевдопеременной Self (стандартный идентификатор). Физически Self представляет собой дополнительный неявный параметр, передаваемый в метод при вызове. Этот параметр и указывает экземпляр объекта, к которому данный метод применяется. Чтобы пояснить сказанное, перепишем метод SetActive, представив его в виде обычной процедуры:
Согласитесь, что метод SetActive выглядит лаконичнее процедуры TDelimitedReader_SetActive. Практика показывает, что псевдопеременная Self редко используется в явном виде. Ее необходимо применять только тогда, когда при написании метода может возникнуть какая-либо двусмысленность для компилятора, например при использовании одинаковых имен и для локальных переменных, и для полей объекта. Если выполнить метод SetActive, Reader.SetActive(True);то обрабатываемый файл будет открыт. При этом неявный параметр Self будет содержать значение переменной Reader. Такой вызов реализуется обычными средствами процедурного программирования приблизительно так: TDelimitedReader_SetActive(Reader, True);Методы, обслуживающие несколько свойств Один и тот же метод может использоваться для получения (установки) значений нескольких свойств одного типа. В этом случае каждому свойству назначается целочисленный индекс, который передается в метод чтения (записи) первым параметром.
В следующем примере уже известный Вам метод GetItem обслуживает три свойства: FirstName, LastName и Phone:
Обращения к свойствам FirstName, LastName и Phone заменяются компилятором на вызовы одного и того же метода GetItem, но с разными значениями параметра Index:
Обратите внимание, что метод GetItem обслуживает как свойство-массив Items, так и свойства FirstName, LastName и Phone. Удобно, не правда ли! Перед тем, как перейти к более сложным понятиям ООП, приведем полную реализацию класса TDelimitedReader. Настоятельно рекомендуем Вам внимательно ознакомиться с этой реализацией, поскольку в ней сведено воедино все то, о чем говорилось в предыдущих разделах.
|
|||||||||||||||||
Последнее изменение этой страницы: 2017-02-21; просмотров: 330; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 35.175.232.163 (0.022 с.) |