Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.016 c
14-98325
mvg_first
2002-09-05 11:58
2002.09.30
Есть ли здесь то нибудь из Кривого Рога (Украина)


3-98025
Шурик Ш
2002-09-10 19:20
2002.09.30
Кнопки MessageDlg


1-98027
Alex17
2002-09-17 13:07
2002.09.30
Вопрос по FIBPlus.


14-98293
Сатир
2002-09-03 19:01
2002.09.30
---|Ветка была без названия|---


1-98057
Skywalker
2002-09-19 12:03
2002.09.30
initialization; finalization