Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создание неизменяемых экземпляров классов в Delphi: паттерн Record Class

Delphi , Компоненты и Классы , Классы

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

Использование инициализации модуля

Один из способов создания неизменяемого экземпляра класса - это его инициализация в процедуре initialization модуля. При этом необходимо не забыть освободить память от экземпляра в процедуре finalization. Пример кода:

interface
var
  metre: TUnit = nil; // Инициализация переменной в интерфейсе
implementation
initialization
  metre := TUnit.Create('метр', 1.0); // Создание экземпляра класса
finalization
  FreeAndNIL(metre); // Освобождение памяти в процедуре finalization
end.

Использование акцессорных функций

Другой способ - использование акцессорной функции, которая создает экземпляр класса при первом обращении к ней. Пример реализации:

interface
function Metre: TUnit;
implementation
var
  _metre: TUnit = nil;
function Metre: TUnit;
begin
  if not Assigned(_metre) then
    _metre := TUnit.Create('метр', 1.0);
  result := _metre;
end;
finalization
  FreeAndNIL(_metre);
end.

Чтение только для записи свойств

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

interface
type
  TUnit = class
  private
    _name: string;
    _scale: Double;
    class function MakeUnit(aName: string; aScale: Double): TUnit; static;
  public
    property Name: string read FName;
    property Scale: Double read FScale;
  end;
function Metre: TUnit;
implementation
class function TUnit.MakeUnit(aName: string; aScale: Double): TUnit;
begin
  Result := TUnit.Create(Self);
  Result._name := aName;
  Result._scale := aScale;
end;
function Metre: TUnit;
var
  instance: TUnit;
begin
  Result := TUnit.MakeUnit('метр', 1.0);
end;
Result := class helper function for static call

Учитывая, что в некоторых случаях экземпляр класса используется как контейнер для данных, можно рассмотреть возможность исключения финализации, так как освобождение памяти произойдет при завершении процесса приложения. Однако, следует избегать использования так называемых "синглтонов" в простых случаях, поскольку они добавляют ненужную сложность и перегрузку.

Также стоит упомянуть о существовании стандартного модуля System.SysUtils и связанной функциональности по работе с единицами измерения в Delphi RTL, которая может быть полезна при разработке подобных систем.

Заключение

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

Создано по материалам из источника по ссылке.

Вопрос связан с созданием неизменяемых экземпляров классов в среде разработки Delphi, используя подходы, аналогичные определению константных записей, и включает инициализацию в модуле, использование акцессорных функций и чтение только


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Классы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 20:59:07/0.0050759315490723/1