Текущий архив: 2002.09.30;
Скачать: CL | DM;
Вниз
И опять идеологический вопрос Найти похожие ветки
← →
qube (2002-09-19 10:59) [0]Нужно создать класс, допустим, TFooEngine. В системе будет присутствовать только один глобальный экземпляр этого класса. Как лучше: наследовать TFooEngine от TComponent и создавать его с Application в качестве владельца, или просто
Engine := TFooEngine.Create(..);
Application.Run;
Engine.Free;
← →
Separator (2002-09-19 11:03) [1]Можешь ему вообще не передавать владельца, главное потом не забудь Free сделать
← →
qube (2002-09-19 11:05) [2]
> Можешь ему вообще не передавать владельца, главное потом
> не забудь Free сделать
Тогда и от TComponent наследовать, собственно, незачем. Вопрос вот в чем: возможно ли, что при втором способе при аварийном завершении или еще какой беде Engine.Free не вызовется?
← →
Старый Паскалист (2002-09-19 11:12) [3]сделай создание и разрушение в initialization/finalization.
А ещё лучше - сделай сознание по требованию,
function Engine: TFooEngine;
begin
if theEngine{глобальная переменная, определённая в impl.} = nil then
theEngine := TFooEngine.Create;
Result := theEngine;
end;
initialization
finalization
theEngine.Free; // вызовется всегда
end.
А связываться с TComponent и Application действительно
совершенно незачем.
← →
qube (2002-09-19 11:14) [4]Спасибо.
← →
Separator (2002-09-19 11:18) [5]При аварийном завершении (например если свет вырубили, типа ФСБ приехало) работы все равно ничего не поможет
← →
qube (2002-09-19 11:19) [6]
> Separator ©
:) Мне ФСБ не грозит. Разве что СБУ.
← →
Separator (2002-09-19 11:24) [7]Понимаю, мне тоже не грозить, зато может КНБ наехать ;)
← →
qube (2002-09-19 11:26) [8]КНБ -- это что?
(Ох, чувствую, удалят эту ветку в "Потрепаться")
← →
Separator (2002-09-19 11:32) [9]"Комитет национальной безопасности"
(Я тож так думаю)
← →
qube (2002-09-19 11:35) [10]Да, тут мысль пришла.
А если конструктор у этого TFooEngine с параметрами, то создание по требованию уже не подходит. Я понимаю, что есть туча способов, а хочется красивенько.
← →
Separator (2002-09-19 11:50) [11]Почему не подходит? Просто создавай когда надо и все будет ок.
type
TFooEngine = class;
public
constructor Create(Parametrs); override;
end;
implementation
var
theEngine: TFooEngine;
constructor TFooEngine.Create(Parametrs);
begin
inherited Create;
// Делай что-нибудь
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if theEngine=nil then
theEngine:= TFooEngine.Create(Parametrs)
end;
finalization
if theEngine<>nil then
theEngine.Free
end.
← →
qube (2002-09-19 11:52) [12]ок, вопрос закрыт.
всем спасибо.
сотворил, как обычно, много шуму из ничего.
← →
Старый Паскалист (2002-09-19 11:55) [13]function Engine: TFooEngine;
begin
if theEngine = nil then
theEngine := TFooEngine.Create(какие-то параметры по умолчанию);
// Параметры по умолчанию могут, например, грузиться из ini-файла
Result := theEngine;
end;
procedure CreateEngineWithParams(......);
// даёт возможность приложению определить, с какими параметрами
// нужно создавать Engine.
// эта процедура специально не объявлена, как ф-я,
// поскольку она мжет быть вызвана только один раз
// при запуске.
// Эта процедура вовсе не обязана действительно создавать
// объект, она может просто сохранить где-то
// параметры, которые будут извлечены при создании по требованию
begin
if theEngine = nil then
theEngine := TFooEngine.Create(......)
else
raise ...;
end;
Но вообще говоря, с моей точки зрения, возможность конструирования
разными способами не должна быть характерен для синглтонов.
Ведь в любом случае в каждом приложении ты сможешь вызвать
конструктор только с одним конкретным набором параметров.
Страницы: 1 вся ветка
Текущий архив: 2002.09.30;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.008 c