Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

В состав любого класса входят два специальных метода - конструктор и деструктор.

Поиск

У класса TObject эти методы называются Create и Destroy, также они называются в подавляющем большинстве его потомков.

Конструктор распределяет объект в динамической памяти (размещаются лишь поля объекта, его методы являются общими для всех объектов данного класса и в кучу не переносятся) и помещает адрес этой памяти в переменную Self, которая автоматически объявляется в классе.

Деструктор удаляет объект из кучи.

Обращение к конструктору должно предварять любое обращение к полям и некоторым методам объекта.

 

По своей форме конструкторы и деструкторы являются процедурами, но объявляются с помощью зарезервированных слов Constructor и Destructor:

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

В базовом классе TObject определен метод Free, который сначала проверяет действительность адреса объекта и лишь затем вызывает деструктор Destroy.

Обращение к деструктору объекта будет ошибочным, если объект не создан конструктором, поэтому для уничтожения ненужного объекта следует вызывать метод Free, как это сделано в предыдущем примере.

Специально для уничтожения объектов в модуле System определена процедура FreeAndNil, которая не только уничтожает объект, но и помещает в его указатель (напомню, что им является идентификатор объекта) значение NIL:

FreeAndNil(MyObject).

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

Вызов любого метода родительского класса достигается с помощьюзарезервированного слова Inherited (унаследованный):

Некоторые методы могут вызываться без создания и инициализации объекта.

Такие методы называются методами класса, они объявляются с помощью зарезервированного слова class:

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

Одноименные методы

В Delphi имеется возможность в рамках одного класса объявлять несколько одноименных методов. Описанный выше механизм перекрытия родительского метода одноименным методом потомка приводит к тому, что потомок «не видит» перекрытый родительский метод и может обращаться к нему лишь с помощью зарезервированного слова Inherited.

В Delphi введено зарезервированное слово overload (перезагрузить), с помощью которого становятся видны одноименные методы как родителя, так и потомка.

Внимание

Чтобы одноименные методы можно было отличить друг от друга, каждый из них должен иметь уникальный набор параметров. В ходе выполнения программы при обращении к одному из одноименных методов программа проверяет тип и количество фактических параметров обращения и выбирает нужный метод.

При обнаружении одноименного метода компилятор Delphi предупреждает о том, что у класса уже есть аналогичный метод с другими параметрами. Для подавления сообщений объявление одноименного метода можно сопровождать зарезервированным словом reintroduce (вновь ввести).

В следующем примере в классе TForm1 используются целых 4 одноименных метода Close. Лишь один из них (унаследованный метод без параметра) выполняет свои основные функции - закрывает окно. Три другие отличаются набором параметров и выводят сообщение в заголовок окна.

Поместите на пустую форму четыре кнопки TButton и напишите такие обработчики их событий Onclick:

Теперь в раздел private класса TForm1 вставьте три объявления методов Close:

 

И, наконец, в разделе implementation поместите описания объявленных методов:

Теперь после запуска программы три первые кнопки будут вызывать методы Close класса TForm1 и менять заголовок окна, в то время как кнопка Button4 обратится к методу Close родительского класса ТForm и закроет окно.

Свойства

Свойства - это специальный механизм классов, регулирующий доступ к полям.

Свойства объявляются с помощью зарезервированных слов property, read и write (слова read и write считаются зарезервированными только в контексте объявления свойства). Обычно свойство связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи в это поле или при чтении из него.

Например

В контексте программы свойство ведет себя как обычное поле.

Например, мы могли бы написать такие операторы:

Более того, возможен и такой оператор присваивания:

Разница между этим оператором и оператором, показанным ниже, заключается в том, что при обращении к свойству автоматически подключается метод SetField, в котором могут реализовываться специфичные действия:

Рассмотрим оператор:

Свойство Caption компонента Label вызывает метод SetText, который не только запоминает строку символов во внутренней переменной, но и осуществляет прорисовку метки с новым текстом.

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

Если необходимо, чтобы свойство было доступно только для чтения или только для записи, следует опустить соответственно часть write или read.

Объявление класса

Любой вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (опубликованные), private (закрытые), protected (защищенные), public (открытые) и automated (автоматизированные). Внутри каждой секции вначале определяются поля, а затем методы и свойства.



Поделиться:


Последнее изменение этой страницы: 2016-08-26; просмотров: 101; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.146.251 (0.006 с.)