![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать объект с глобальной видимостью? [D7, XP]
neveGreen © (2008-12-07 23:07:00)Как создать объект с глобальной видимостью, чтобы он был видим как Application?
Джо (2008-12-11 02:42:00) [1]
> Ins © (10.12.08 17:06) [23]
Функия Singleton тут избыточна.
Вызывайте конструктор класса, сколько будет угодно :)
Ins (2008-12-10 17:06:00) [2]
> народ там уже начал предлагать альтернативы :)
Ну не нравится мне такая реализация :) Если быть совсем придирчивым, то пример Юрия не всем требованиям к синглтону удовлетворяет. Класс не только должен гарантировать существование единственного экземпляра, но и предоставлять к нему точку доступа. Остальные способы доступа хорошо бы сделать недоступными. Нехорошо получится, если кто-то попытается в обход функции Singletone вызвать конструктор. Ну и породить новый синглтон должно быть максимально просто, без лишних телодвижений в виде объявления переменных/функций доступа. А про NewInstance - это верное замечание.
Григорьев Антон (2008-12-10 16:29:00) [3]
> Юрий Зотов © (10.12.08 14:59) [21]
> Отметился...
> :o)
Да, я уже видел :) Тема поднята, народ там уже начал предлагать альтернативы :)
Юрий Зотов (2008-12-10 14:59:00) [4]
> Григорьев Антон © (09.12.08 08:56) [13]
Отметился...
:o)
neveGreen (2008-12-09 21:13:00) [5]
> Юрий Зотов © (09.12.08 21:04) [19]
Ха... а я сделал его потомка!!!! :)
Юрий Зотов (2008-12-09 21:04:00) [6]> neveGreen (09.12.08 21:00) [18]
Странный вопрос. Как и в любой другой класс, конечно.
neveGreen (2008-12-09 21:00:00) [7]
> Юрий Зотов © (08.12.08 01:10) [8]
и как добавить свойство или метод в него?
oxffff (2008-12-09 15:42:00) [8]
> clickmaker © (09.12.08 13:05) [15]
Естественно следует не забывать о выполняемом коде переинициализации.
А именно о коде конструкторов и коде AfterConstruction(который выполняется при вызове с параметром классовой ссылки ну или хитро помутив dl регистр).
oxffff (2008-12-09 15:29:00) [9]
> clickmaker © (09.12.08 13:05) [15]
Проверка на if _Singleton = nil then делается в
class function TSingleton.NewInstance: TObject;
clickmaker (2008-12-09 13:05:00) [10]> [14] oxffff © (09.12.08 09:39)
смысл этой поправки?
oxffff (2008-12-09 09:39:00) [11]Юрий Зотов © (08.12.08 01:10) [8]
Позволите чуть поправить?
function Singleton: TSingleton;
begin
if _Singleton = nil then
TSingleton.Create(..);
Result := _Singleton
end;
на
function Singleton: TSingleton;
begin
Result := TSingleton.Create(..);
end;
Григорьев Антон (2008-12-09 08:56:00) [12]
> Юрий Зотов © (08.12.08 01:10) [8]
> Прочитал материал по ссылке...
Юрий, что ж ты это только здесь написал? Скоро ветка уйдёт в архив, и твои поправки будет найти очень трудно. А продублировал бы это ещё и комментариях к самой статье, и все, кто её читает, тоже увидели бы твои замечания.
Юрий Зотов (2008-12-09 00:09:00) [13]> neveGreen (08.12.08 23:55) [11]
Если изменили код - возможно.
neveGreen (2008-12-08 23:55:00) [14]
> Юрий Зотов © (08.12.08 01:10) [8]
Stack Overflow ???
neveGreen (2008-12-08 23:35:00) [15]Спасибо. А наблюдатель как я понимаю можно просто сделать на TActionList ?
Германн (2008-12-08 01:27:00) [16]
> Юрий Зотов © (08.12.08 01:10) [8]
>
> Прочитал материал по ссылке...
>
> "Беда, коль пироги начнет печи сапожник..."
> (c) И.А. Крылов.
>
И уж в который раз такое.
Ну а как нам с Амёбой жить далее? Если даже статьи на Королевстве не внушают доверия!
:)
Юрий Зотов (2008-12-08 01:10:00) [17]Прочитал материал по ссылке...
"Беда, коль пироги начнет печи сапожник..."
(c) И.А. Крылов.
Прежде, чем писать статьи, автору не помешало бы заглянуть в код TObject или хотя бы в справку. И там он нашел бы два вполне симпатичных метода - NewInstance и FreeInstance. Что избавило бы его от нагромождения целой кучи совершенно лишнего кода при реализации синглтона.
unit SingletonUnit;
uses ...
type
TSingleton = class(...)
...
public
class function NewInstance: TObject; override;
procedure FreeInstance; override;
end;
function Singleton: TSingleton; // Для получения экземпляра
implementation
var
_Singleton: TSingleton;
function Singleton: TSingleton;
begin
if _Singleton = nil then
TSingleton.Create(..);
Result := _Singleton
end;
class function TSingleton.NewInstance: TObject;
begin
if _Singleton = nil then
_Singleton := TSingleton(inherited NewInstance);
Result := _Singleton;
end;
procedure TSingleton.FreeInstance;
begin
inherited;
_Singletone := nil
end;
initialization
Singleton; // Этого можно и не делать, создание будет по первому запросу
finalization
_Singleton.Free
end.
Amoeba (2008-12-07 23:43:00) [18]Например так:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=267
neveGreen (2008-12-07 23:33:00) [19]я хочу сделать синглтон но чёто не соображу как...
Anatoly Podgoretsky (2008-12-07 23:26:00) [20]> neveGreen (07.12.2008 23:07:00) [0]
Application не является глобально видимым объекту, а еще точнее, таких объектов нет. Видимостью управляет программист.