Есть два способа достичь чего-то подобного , в зависимости от ваших потребностей:
Первый способ включает инициализацию экземпляра вашего класса либо в процедуре инициализации модуля (запоминание для освобождения экземпляра в соответствующей процедуре финализации), либо с помощью функции модуля доступа для инициализации экземпляра при первом доступе:
а)
interface
var
metre : TUnit = NIL; // Can initialise a unit variable
:
implementation
:
initialization
metre := TUnit.Create( ... );
finalization
FreeAndNIL(metre);
end.
ПРИМЕЧАНИЕ. Если ваш класс является просто контейнером для данных, как это следует из вашего вопроса, то вы можете рассмотреть вопрос об исключении финализации Free'ing - хотя техническая утечка памяти, вы фактически ничего не потеряете, так как память используется вашей экземпляр будет восстановлен, когда ваш процесс приложения завершится. Бесплатное завершение может привести к проблемам, если другой код завершения в вашем проекте получит доступ к экземпляру счетчика после его освобождения.
Я бы также предостерег вас от попыток использовать любые так называемые "синглтон" классы. Они добавляют сложность и накладные расходы для нулевой выгоды в таких простых случаях, как этот.
б)
interface
function Metre: TUnit;
implementation
var
_metre : TUnit = NIL; // Can initialise a unit variable
function Metre: TUnit;
begin
if NOT Assigned(_metre) then
_metre := TUnit.Create( ... );
result := _metre;
end;
finalization
FreeAndNIL(metre);
end.
Те же наблюдения с возможностью окончательного оформления применимы и в этом случае.
Обратите также внимание, что если производительность является серьезной проблемой, и эта функция доступа, вероятно, будет использоваться много, тогда вы можете предпринять дальнейшие шаги для оптимизации этой области, используя указатель функции, изначально инициализированный для заводской функции, который заменяет себя на указатель на простую безусловную функцию доступа при первом доступе.
Второй способ добиться этого - использовать функции класса для возврата фиксированных значений из специально полученного класса, а не использовать данные-члены. Тогда вам вообще не нужно создавать экземпляр класса и не нужно беспокоиться о его утилизации. Я не могу вспомнить, если Delphi 2010 теперь поддерживает переменные класса, а также функции класса - если да, то это тоже может быть ответом. Но если вы не используете Delphi 2010, вопрос все равно будет спорным.
Это будет выглядеть примерно так:
TMetre = class(TUnit)
class function Name: String; override;
class function Scale: Double; override;
end;
и т.д.
Интересно, однако ... Вам известно о функциональности единицы стандартного преобразования и связанной с ней единиц измерения? Я спрашиваю только потому, что содержание этого вопроса выглядит так, как будто оно уже удовлетворено существующим аспектом Delphi RTL.