Сингълтън в Делфи
Как да направя общ сингълтон клас, когато в Delphi няма променливи на статичен клас.
> Как да направим общ сингъл клас
Универсално защо?
Да наследим от TSingleton.
> Да наследим от TSingleton.
можете да направите един клас, който ще предостави сингълтоните на всеки клас.
> ако Delphi няма статични променливи на класа
какво означава, ако?
Ако няма полета на класа, тогава нищо не ви пречи да разпределите отделна единица за този случай, където просто няма кой да се позове на променливата, декларирана в изпълнение, и да прекъсне капсулирането.
Но би било крайно време да слезем от древните версии на делфите
Обикновено няма да работи. Можете да създадете списък, в който да поставите вече създадени копия на класове. И ключът в този списък ще бъде указател към класа.
Delphi 7 няма.
Тогава TSingleton ще се провали.
Това е.
Трябва да създадете глобални списъци и т.н.
Ужас.
> Трябва да създадете глобални списъци и т.н.
> Ужас.
какво е ужасно? един списък точно в единичния модул. не всеки път да ги пиша.
> Как без тях тогава?
може да се направи на "атоми" или "мутекси". задайте име по процес + номер "единичен" (така че 2 копия да работят).
. и тук ще има истински ужас.
> Как тогава без тях?
Да, правите най-простия вариант:
TMySingleton = клас (.)
.
край;
функция MySingleton: TMySingleton;
вар
__MySingleton: TMySingleton;
функция MySingleton: TMySingleton;
започнете
ако __MySingleton = нула тогава
__MySingleton: = TMySingleton.Create;
Резултат: = __MySingleton;
край;
Тук ще бъдеш сингъл. Контакт - MySingleton.
> Само ако потокът е един, ако няколко не вървят по този начин, InterlockedXXX
> функциите са необходими тогава.
Ако е многопоточен, добавете CS. например.
Всичко може да бъде решено и то с малко кръв.
Също така трябва да вкарате прекалената, когато пускате.
> Също така трябва да вкарате прекалената, когато пускате.
> Какво ще направите, ако финализирането на някой друг реши да направи това
> обект за контакт?
> Ще се изпарите, за да изградите реда на финализиране. Не ги харесвам
> единични:)
Да, и аз наистина не го харесвам.
> Тогава TSingleton ще се провали.
въпросът е, че полетата на класа в по-новите версии на Delphi работят по същия начин. например има програмен проект14 код;
Тип
TA = клас
строго защитен
клас вар
FCount: Цяло число;
публично
конструктор Създаване; виртуален;
край;
TB = клас (TA)
публично
конструктор Създаване; заместване;
край;
TC = клас (TA)
публично
конструктор Създаване; заместване;
край;
конструктор TA.Create;
започнете
writeln (FCount);
Inc (FCount)
край;
конструктор TB.Create;
започнете
наследен;
writeln (FCount);
writeln ("-------------");
край;
конструктор TC.Create;
започнете
наследен;
writeln (FCount);
writeln ("-------------");
край;
започнете
TB.Create.Destroy;
TC.Create.Destroy;
readln
край.
run и виждаме, че има само един екземпляр на полето FCount:
така че дори и с полетата на класа се нуждаете от речник на наследници-единици
И ако 2 единични?
Какво ще бъде в __MySingleton?
FLASH има глобална променлива за класа.
Виждам това само в Ню Делфи.
А в старите трябва да правите някакви списъци.