|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Когда начинается работа с объектом, то он размещается в памяти
Чтобы сконструировать объект (выделить память для экземпляра):
Reader:= TDelimitedReader.Create;
Create — это конструктор объекта; он всегда присутствует в классе и служит для создания и инициализации экземпляров. При создании объекта в памяти выделяется место только для его полей. Методы, как и обычные процедуры и функции, помещаются в область кода программы; они умеют работать с любыми экземплярами своего класса и не дублируются в памяти.
После создания объект можно использовать в программе: получать и устанавливать значения его полей, вызывать его методы. Доступ к полям и методам объекта происходит с помощью уточненных имен, например: Reader.NextLine;
Кроме того, как и при работе с записями, допустимо использование оператора with, например:
with Reader do NextLine; Если объект становится ненужным, он должен быть удален вызовом специального метода Destroy, например:
Reader.Destroy; // Освобождение памяти, занимаемой объектом Destroy – это деструктор объекта; он присутствует в классе наряду с конструктором и служит для удаления объекта из динамической памяти. После вызова деструктора переменная Reader становится несвязанной и не должна использоваться для доступа к полям и методам уже несуществующего объекта. Чтобы отличать в программе связанные объектные переменные от несвязанных, последние следует инициализировать значением nil.
Reader:= nil; ... if Reader <> nil then Reader.Destroy;
Вызов деструктора для несуществующих объектов недопустим и при выполнении программы приведет к ошибке. Чтобы избавить программистов от лишних ошибок, в объекты ввели предопределенный метод Free, который следует вызывать вместо деструктора. Метод Free сам вызывает деструктор Destroy, но только в том случае, если значение объектной переменной не равно nil. if Reader <> nil then ~ Reader.Free Reader.Destroy
После уничтожения объекта переменная Reader сохраняет свое значение, продолжая ссылаться на место в памяти, где объекта уже нет. Если эту переменную предполагается еще использовать, то желательно присвоить ей значение nil, чтобы программа могла проверить, существует объект или нет. Reader.Free; ~ FreeAndNil(Reader); Reader:= nil; Значение одной объектной переменной можно присвоить другой. При этом объект не копируется в памяти, а вторая переменная просто связывается с тем же объектом, что и первая:
var R1, R2: TDelimitedReader; // Переменные R1 и R2 не связаны с объектом begin R1:= TDelimitedReader.Create; // Связывание переменной R1 с новым объектом // Переменная R2 пока еще не связана ни с каким объектом R2:= R1; // Связывание переменной R2 с тем же объектом, что и R1 // Теперь обе переменные связаны с одним объектом R2.Free; // Уничтожение объекта // Теперь R1 иR2 не связаны ни с каким объектом end; Создание объекта включает выделение памяти под экземпляр и инициализацию его полей, а разрушение – очистку полей и освобождение памяти. Действия по инициализации и очистке полей специфичны для каждого конкретного класса объектов. По этой причине Delphi позволяет переопределить стандартный конструктор Create и стандартный деструктор Destroy для выполнения любых полезных действий. Можно даже определить несколько конструкторов и деструкторов (имена им назначает сам программист), чтобы обеспечить различные процедуры создания и разрушения объектов.
type TDelimitedReader = class ... Constructor Create(const FileName: string; const ADelimiter: Char = ';'); Destructor Destroy; override; ... end;
constructor TDelimitedReader.Create(const FileName: string; const ADelimiter: Char = ';'); begin AssignFile(FileVar, FileName); Delimiter:= ADelimiter; end; destructor TDelimitedReader.Destroy; begin … end;
Если объект содержит встроенные объекты или другие динамические данные, то конструктор – это как раз то место, где их нужно создавать. Конструктор применяется к классу или к объекту. Если он применяется к классу,
Reader:= TDelimitedReader.Create('MyData.del', ';');
то выполняется следующая последовательность действий: 1) в динамической памяти выделяется место для нового объекта; 2) выделенная память заполняется нулями. В результате все числовые поля и поля порядкового типа приобретают нулевые значения, строковые поля становятся пустыми, а поля, содержащие указатели и объекты получают значение nil; 3) затем выполняются заданные программистом действия конструктора; 4) ссылка на созданный объект возвращается в качестве значения конструктора. Тип возвращаемого значения совпадает с типом класса, использованного при вызове.
Если конструктор применяется к объекту, Reader.Create('MyData.del', ';');
то конструктор выполняется как обычный метод. Другими словами, новый объект не создается, а происходит повторная инициализация полей существующего объекта. В этом случае конструктор не возвращает никакого значения. Далеко не все объекты корректно себя ведут при повторной инициализации, поскольку программисты редко закладывают такую возможность в свои классы. Поэтому на практике повторная инициализация применяется крайне редко.
Деструктор уничтожает объект, к которому применяется:
Reader.Destroy;
В результате: 1) выполняется заданный программистом код завершения; 2) освобождается занимаемая объектом динамическая память.
В теле деструктора обычно должны уничтожаться встроенные объекты и динамические данные, как правило, созданные конструктором. Как и обычные методы, деструктор может иметь параметры, но эта возможность используется редко.
Директива Override должна быть указана в определении деструктора, так как мы отменяем виртуальный метод уничтожения TObject.
В конце деструктора, вы должны вызвать Inherited для вызова родительского деструктора.
Пример, что деструктор явно можно не вызывать: procedure TForm1.FormCreate(Sender:Object); var begin Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.) |