![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Singleton [D5, Win2k]
Fktrc © (2004-11-23 05:10:00)Можно ли в Delphi создать единственный экземпляр класса на все приложение? Т.е. чтобы при попытках создать второй выдавалась либо ошибка компиляции, либо рантайм ошибка. По-моему, такие объекты называют singleton, хотя могу и ошибаться.
Пока приходит в голову только создание какого-л именованного объекта ядра в конструкторе объекта. Но нет ли другого способа, изящнее?
Суслик (2004-11-23 15:43:00) [1]
> Это проблема TObject :)
это не проблема tobject, это особенность дельфи - нет понижения видимости.
Может это и к лучшему...
Palladin (2004-11-23 15:41:00) [2]Это проблема TObject :) Я не виноват что в нем Free невиртуальный :)
VMcL (2004-11-23 15:34:00) [3]>> Palladin © (23.11.04 13:37) [39]
Даже без FreeAndNil.
TObject(SingleObject).Free;
:-p
jack128 (2004-11-23 14:45:00) [4]Суслик © (23.11.04 14:15) [43]
Спасибо, что напомнил ;-) Но в данном случае это не имеет значение.
Суслик (2004-11-23 14:15:00) [5]
> [42] jack128 © (23.11.04 14:09)
create должен быть virtual
иначе создаться объект класса tsingletone, но выполниться тело конструктора tobject
jack128 (2004-11-23 14:09:00) [6]var
cl: TClass;
begin
cl := TSingletone;
with cl.Create do
...
end;
Palladin (2004-11-23 13:43:00) [7]Ну и хрен с ним...
> [40] jack128 © (23.11.04 13:41)
через какую классовую ссылку?
jack128 (2004-11-23 13:41:00) [8]Palladin © (23.11.04 13:37) [39]
и создать твой объект можно. Через классовую ссылку ;-)
Palladin (2004-11-23 13:37:00) [9]Сорри, а ведь точно сделает...
Palladin (2004-11-23 13:35:00) [10]Не сделает, не волнуйся.
GuAV (2004-11-23 13:25:00) [11]Palladin © (23.11.04 13:02) [28]
Ха! FreeAdnNil его сделает! :)
Суслик (2004-11-23 13:23:00) [12]
> [35] Palladin © (23.11.04 13:21)
> Хем, ну что ж... ты понизил абстрагирование обсуждения Singletone
> до Делфи, я в свою очередь понизил до Делфи6... :)
Точное замечание:)
Palladin (2004-11-23 13:21:00) [13]Хем, ну что ж... ты понизил абстрагирование обсуждения Singletone до Делфи, я в свою очередь понизил до Делфи6... :)
Суслик (2004-11-23 13:15:00) [14]
> [32] Palladin © (23.11.04 13:11)
> Конструктор от TObject.
гонишь :)))
Как раз он то и будет виден. Твой новый конструктор виден не будет.
Суслик (2004-11-23 13:12:00) [15]
> [31] Palladin © (23.11.04 13:10)
> Я пробовал что написал. Не видно. D6
ну бог в помощь :)
Для справки: в дельфи не документированно понижение видимости. В д3 оно было, но работало не так, как в д5. Если не ошибаюсь и в д6 нет документации на понижение видимости. Если найдешь оное, буду благодарен за информацию.
Palladin (2004-11-23 13:11:00) [16]
> Кто не будет виден в другом модуле?
Конструктор от TObject.
Palladin (2004-11-23 13:10:00) [17]Я пробовал что написал. Не видно. D6
Суслик (2004-11-23 13:09:00) [18]
> [28] Palladin © (23.11.04 13:02)
у тебя create виден, только не tsingletone, а tobject.
Спасти свой класс от инстанцирования тебе не удасться :)
Кроме как переопределить в PUBLIC конструктор Create, в нем возбуждать исключение, а пользоваться другим private конструктором.
Суслик (2004-11-23 13:06:00) [19]
> [28] Palladin © (23.11.04 13:02)
> Ну вот, попробовал... в этом модуле будет видно, в других
> нет...
> хоть заудаляйся...
ты сам проверял, что написал?
Кто не будет виден в другом модуле?
Все видно :)
Palladin (2004-11-23 13:02:00) [20]
> а ты попробуй :)))
Unit Singletone;
Interface
Type
TSingletone=Class
Protected
Constructor Create;
Destructor Destroy;
Public
Class Function New:TSingletone;
Class Procedure Free;
End;
Implementation
Var
SingleObject:TSingletone;
Class Function TSingletone.New;
Begin
If SingleObject=Nil Then SingleObject:=TSingletone.Create;
Result:=SingleObject;
End;
Constructor TSingletone.Create;
Begin
End;
Class Procedure TSingletone.Free;
Begin
End;
Initialization
SingleObject:=Nil;
End.
Ну вот, попробовал... в этом модуле будет видно, в других нет...
хоть заудаляйся...
> А знаешь почему?
Спасибо за разьяснения... даже и в голову не приходило... года три назад...