Chcete zjednodušený způsob používání sdílených objektů, který by dodržoval klasickou syntaxi objektů a v případě potřeby automaticky volal use/end use?
Připoutejte se, přicházejí sdílené třídy!
Vytváření a správa sdílených tříd
Ve verzi 4D 20 R5 jsme přidali nový koncept: Sdílené třídy.
Sdílené třídy lze použít pouze k vytváření sdílených objektů a jako takové zjednodušují jejich používání. Chcete-li vytvořit sdílenou třídu, stačí do jejího konstruktoru přidat klíčové slovo shared:
//class SharedClass
shared Class constructor()
Sdílené třídy nelze použít k vytváření standardních objektů: pokaždé, když zavoláte funkci new() pro vytvoření nového objektu této třídy, bude to sdílený objekt.
Rozšíření na funkce třídy
Klíčové slovo shared lze použít také u funkcí třídy, což znamená, že tato funkce modifikuje objekt. Uvnitř funkce není třeba volat use a end use, protože jsou automaticky volány při volání a ukončení funkce. To samozřejmě platí i pro konstruktor singletonu.
shared Function myFunction()
This.attribute:="whatever"
Samozřejmě byste měli dávat pozor při používání klíčového slova shared u funkcí, které ho nepotřebují, abyste předešli zablokování jiných procesů, které se snaží objekt použít.
Správné používání sdílených tříd a funkcí by vám mělo umožnit manipulovat se sdílenými objekty, jako by to byly normální objekty, což zjednoduší váš kód.
Úvahy o dědičnosti
Poslední bod, na který je třeba si dát pozor, je, že nesdílené třídy mohou dědit ze sdílených tříd, ale sdílené třídy nemohou dědit z nesdílených tříd. Naplánujte si tedy svůj objektový model podle toho.
Příklad
Řekněme, že musíte provést dlouhý výpočet a raději použijete worker, abyste se vyhnuli blokování důležitých procesů. Je však zřejmé, že v určitém okamžiku potřebujete získat výsledek výpočtu. Použijme tuto třídu CalculationResult:
// class CalculationResult
shared Class constructor()
This.isFinished:=False
Function makeCalculation()
...
This.finished:=True
shared Function set finished($finished : Boolean)
This.isFinished:=$finished
shared Function get finished()->$finished : Boolean
$finished:=This.isFinished
Chcete-li ji použít, stačí provést:
$calculation:=cs.CalculationResult.new()
CALL WORKER("AnyWorker"; Formula($calculation.makeCalculation()))
While (Not($calculation.isFinished))
//Code that will be executed while the calculation is in progress
End while
Doufám, že vám sdílené třídy pomohou používat sdílené objekty v celé aplikaci. Pokud máte nějaké dotazy, neváhejte s nimi přijít do fóra 4D.