Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.012 c
6-98250
Shil
2002-07-30 10:05
2002.09.30
В продолжение Indy


3-98005
Aristarh
2002-09-09 17:55
2002.09.30
Ошибка при открытии IB таблицы.


14-98296
Eduard
2002-09-02 16:02
2002.09.30
Как зарегистрироваться на Борланде ?


3-97978
mouse_365
2002-09-09 20:14
2002.09.30
D5+MSSQL2000


4-98393
oduvan
2002-08-13 19:37
2002.09.30
Проблема при подаче сообщения WM_COPYDATA из формы в форму.




   Наверх