
Последние записи
- Автоматическое уничтожение объектов
- Найти среднее значение по данным в ячейке
- Число различных чисел (Microsoft Office Excel)
- Убить процесс
- Конвертер heic в jpg
- Проверка на шестнадцатеричный формат записи
- Отдать пользователю файл с помощью file_get_contents()
- Написать собственую функцию operator[] для битов
- Проблема с движением 2D человека
- OpenGl.Создание винтовой лестницы

Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
5th
Апр
Автоматическое уничтожение объектов
Posted by obzor under Delphi
Сколько видел программ на Free Pascal’е — везде объекты уничтожаются вручную, через Free или FreeAndNil. А ведь можно сделать чтобы это происходило автоматически. Для этого надо с объектами работать через интерфейсы и классы делать производными от TInterfacedObject. Переменная типа interface является интеллектуальным указателем, который контролирует использование объекта. Если пытаться использовать переменную типа interface без инициализации, то компилятор выдаст предупреждение. Когда уже никто не использует объект, переменная-интерфейс уничтожит его автоматически.
Вот пример: создадим объект очередь (queue) с двумя методами — Put (положить в очередь) и Get (взять из очереди). Создадим для этого объекта интерфейс QueueObj . Новая очередь будет создаваться в функции New:
unit queue;
{$mode ObjFPC}
interface
uses
Classes, SysUtils;
type
QueueObj = interface
procedure Put( value: longint );
procedure Get( var has_some: boolean; var value: longint);
end;
function New : QueueObj;
implementation
type
QueueImpl = class ( TInterfacedObject, QueueObj )
public
procedure Put( value: longint );
procedure Get( var has_some: boolean; var value: longint);
destructor Destroy; override;
end;
destructor QueueImpl.Destroy;
begin
writeln( 'queue destructor called.' );
end;
procedure QueueImpl.Put( value: longint );
begin
writeln( 'Put called.' );
end;
procedure QueueImpl.Get( var has_some: boolean; var value: longint);
begin
writeln( 'Get called.' );
has_some := true;
value := 5;
end;
function New : QueueObj;
begin
Result := QueueImpl.Create;
end;
end.
Вот как пользоваться нашей очередью:
program project1;
uses queue;
var
q: queue.QueueObj;
procedure Proc1( qu: queue.QueueObj );
var
has: boolean;
value: longint;
begin
qu.Get( has, value );
if has
then begin
writeln( value );
end;
end;
begin
q := queue.New;
q.Put( 7 );
Proc1( q );
end.
Вывод у программы:
$ ./project1
Put called.
Get called.
5
queue destructor called.
——-
Объект уничтожается автоматически. Деструктор вызывается.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas

Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)