{"id":335961,"date":"2022-07-20T15:00:54","date_gmt":"2022-07-20T15:00:54","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=335961"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=335961","title":{"rendered":"<span>\u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u041a\u043b\u0438\u0435\u043d\u0442 2. \u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><a href=\"https:\/\/habr.com\/ru\/post\/677312\/\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0432<\/a> \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043c\u0435\u043d\u0443 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438 \u043f\u043e\u043a\u0430\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432. \u041f\u043e\u0442\u043e\u043c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (IoC). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0433\u0440 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0435\u0430\u043d\u0441\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0433\u0440\u044b, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u0430\u0445 \u0438\u043b\u0438 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u043a\u0435\u0440\u0435. \u041f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0437\u0432\u0443\u043a\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043b\u043e\u0433\u043e\u0432 \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u043d\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c <a href=\"https:\/\/api.openfl.org\/openfl\/events\/Event.html\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c<\/a>.<\/p>\n<p>\u0412\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0444\u043e\u0440\u043c\u0438\u0432\u0448\u0438\u043c\u0441\u044f \u0438\u0433\u0440\u043e\u0432\u044b\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c. <\/p>\n<h2>\u0421\u043a\u0440\u0438\u043d\u044b<\/h2>\n<p>\u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0440\u0430\u043d \u043c\u0435\u043d\u044e. \u041f\u043e\u0441\u043b\u0435 \u043a\u043b\u0438\u043a\u0430 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;\u041d\u0430\u0447\u0430\u0442\u044c \u0438\u0433\u0440\u0443&#187; \u044d\u043a\u0440\u0430\u043d \u043c\u0435\u043d\u044e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0440\u0430\u043d \u0438\u0433\u0440\u044b. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u043c\u0435\u043d\u044b \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435. \u041d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/tree\/main\/c_screens\/client_haxe\/src\" rel=\"noopener noreferrer nofollow\">Screens<\/a>. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043a\u0438\u043d\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>Main<\/code>:<\/p>\n<pre><code>class Main extends Sprite {     public function new()     {         super();         new Screens(this);     } }<\/code><\/pre>\n<pre><code>class Screens extends Component { \/\/ State     private static var instance:Screens;     public static function getInstance():Screens     {         if (instance == null)         {             instance = new Screens();         }         return instance;     }     public var currentScreen(default, null):Screen;     private var currentScreenClass:Class&lt;Screen>;      \/\/ Init     public function new()     {         super();         if (instance != null)         {             throw new Exception(\"Singleton class can have only one instance!\");         }         \/\/ Should be set only once         instance = this;     }     override public function dispose():Void     {         if (currentScreen != null)         {             currentScreen.dispose();             currentScreen = null;         }         super.dispose();     }     \/\/ Methods     public function open(type:Class&lt;Screen>):Screen     {         if (currentScreenClass == type)         {             \/\/ Skip same             return currentScreen;         }         close(currentScreen);         \/\/ Open new         currentScreenClass = type;         currentScreen = Std.downcast(_open(cast type), Screen);         \/\/ Move new screen to the bottom, under all global dialogs (and other elements if any)         moveToBottom(currentScreen);         return currentScreen;     }      private function _open(type:Class&lt;Component>):Component     {         if (type == null)         {           return null;         }         \/\/ Get or create         var instance:Component = createComponent(type);         \/\/ Add         addChild(instance);         return instance;     }     \/\/ For both screens and dialogs     public function close(instance:Component):Void     {         if (instance == null)         {           return;         }         \/\/ Remove         if (instance == currentScreen)         {             currentScreen = null;             currentScreenClass = null;             \/\/ Dispose             instance.dispose();         }     }     private function moveToBottom(component:Component):Void     {         if (component != null &amp;&amp; component.skin != null &amp;&amp; component.skin.parent != null)         {           component.skin.parent.addChildAt(component.skin, 0);         }     } }<\/code><\/pre>\n<p>\u0421\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043d \u043c\u043e\u0436\u043d\u043e \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435: <code>Screens.getInstance().open(MenuScreen);<\/code>.<\/p>\n<h2>\u0414\u0438\u0430\u043b\u043e\u0433\u0438<\/h2>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u043a\u0440\u0438\u043d\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/tree\/main\/e_dialogs\/client_haxe\/src\" rel=\"noopener noreferrer nofollow\">\u0434\u0438\u0430\u043b\u043e\u0433\u0438<\/a>. \u0414\u0438\u0430\u043b\u043e\u0433\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0441\u043a\u0440\u0438\u043d\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0441\u043a\u0440\u0438\u043d, \u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u2014 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u2014 <code>openDialog()<\/code>. <\/p>\n<p>\u0414\u0438\u0430\u043b\u043e\u0433\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432: \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435. \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>Screens<\/code>, \u0432\u0442\u043e\u0440\u044b\u0435 \u2014 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043d. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u043a\u0440\u0438\u043d\u043e\u043c, \u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0430\u043a \u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0441\u0435\u0442\u044c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0438\u0445 \u043d\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0448\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0415\u0449\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u043b \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0438, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0435\u0433\u043e \u0441\u043a\u0438\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0430\u043c\u044b\u0439 \u043d\u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (display list). \u0412\u043e\u0442, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432:<\/p>\n<pre><code>class Screens extends Component {     \/\/ State     \/\/ ...     private var dialogStack:Array&lt;Component> = []; \/\/ To disable all under modal     private var localDialogs:Array&lt;Component> = []; \/\/ To close dialogs related to previous screen      \/\/ Init     override public function dispose():Void     {         for (dialog in dialogStack)         {           dialog.dispose();         }         dialogStack.resize(0);         localDialogs.resize(0);         \/\/ ...     }     \/\/ Methods     public function open(type:Class&lt;Screen>):Screen     {         if (currentScreenClass == type)         {             \/\/ Skip same             return currentScreen;         }         \/\/ Close previous         for (dialog in localDialogs)         {             close(dialog);         }         \/\/ ...     }     public function openDialog(type:Class&lt;Component>, ?global:Bool):Component     {         var dialog = _open(type);         if (dialog == null)         {           return null;         }         dialogStack.push(dialog);         if (!global)         {           localDialogs.push(dialog);         }         return dialog;     }      \/\/ For both screens and dialogs     public function close(instance:Component):Void     {         if (instance == null)         {             return;         }         \/\/ Remove         if (instance == currentScreen)         {             currentScreen = null;             currentScreenClass = null;             \/\/ Dispose             instance.dispose();         }         if (dialogStack.remove(instance))         {             \/\/ Dispose             instance.dispose();         }         localDialogs.remove(instance);     } }<\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043a\u0440\u0438\u043d\u0430 \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c <code>assetName<\/code>. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e <code>Screen<\/code> \u0438 <code>Dialog<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a \u043a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f (<code>closeButton<\/code>), \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0443\u0437\u044b\u043a\u0438, \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u0438 \u0442.\u0434.<\/p>\n<p>\u0421\u043a\u0440\u0438\u043d\u044b \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 <code>assetName<\/code>. \u041e\u043d\u0438 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432-\u043f\u0430\u043d\u0435\u043b\u0435\u0439, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0445 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0441\u0442\u043e\u044f\u0442 \u0441\u0430\u043c\u0438 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445, \u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043a\u0438\u043d\u0430. \u0418 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438 UI-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0432\u043e\u0439 \u0441\u043a\u0438\u043d \u043f\u043e <code>skinPath<\/code>.<\/p>\n<h2>\u0418\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (IoC)<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0443 \u043d\u0430\u0441 <code>Screens<\/code>. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043d\u043e\u0432 \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u0438 \u0441\u043a\u0440\u0438\u043d\u044b \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0434\u043b\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u043e\u043d\u0430 \u0438\u0433\u0440\u044b \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438\u043b\u0438 \u043a\u043e\u0435-\u0447\u0442\u043e \u0432 \u043b\u043e\u0433\u0438\u043a\u0435, \u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043d\u0430 \u0438\u043b\u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0430. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>class MenuScreen2 extends MenuScreen {     override private function init():Void     {     settingsPanelClass = SettingsPanel2         super.init();     } } class SettingsPanel2 extends SettingsPanel {     override private function init():Void {         super.init();         langPanel.skinPath = \"\";     } }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0435\u0449\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>MenuScreen<\/code> \u043d\u0430 <code>MenuScreen2<\/code>, \u0447\u0442\u043e \u043f\u043e\u0432\u043b\u0435\u0447\u0435\u0442 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e \u0446\u0435\u043f\u043d\u043e\u0439 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u0435\u0449\u0435 \u0446\u0435\u043b\u044b\u0439 \u0448\u043a\u0432\u0430\u043b \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/p>\n<p>\u042f\u0441\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0437\u043c\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e \u0442\u043e, \u043a\u0430\u043a\u043e\u0439 \u0446\u0435\u043d\u043e\u0439 \u043e\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f, \u043d\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b \u0431\u044b \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0438\u043f\u044b. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441 \u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u0432 <code>Main<\/code>:<\/p>\n<pre><code>class SettingsPanel2 extends SettingsPanel {     override private function init():Void {         super.init();         langPanel.skinPath = \"\";     } } class Main extends Sprite {     public function new()     {         registerSubstitution(SettingsPanel, SettingsPanel2);         \/\/ ...     } \/\/ ... }<\/code><\/pre>\n<p>\u041d\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043b\u0438 \u044d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u043d\u043e \u0441 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b? \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c? \u041c\u043e\u0436\u043d\u043e \u0438 \u043f\u0440\u0438 \u0442\u043e\u043c \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0443 \u043d\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>createComponent()<\/code>, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043d\u0435\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<pre><code>class MenuScreen extends Component {     \/\/...     private function init():Void     {         \/\/...         settingsPanel = createComponent(SettingsPanel);         \/\/...     }     \/\/... }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u0442\u0438\u043f\u043e\u0432, \u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e <code>Main<\/code>. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a Main \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0435\u0449\u0435 \u043a\u0443\u0447\u0443 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u0437\u043d\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u044d\u0442\u0443 \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u2014 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/d_managers\/client_haxe\/src\/v3\/lib\/IoC.hx\" rel=\"noopener noreferrer nofollow\">IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<\/a>, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e <code>IoC<\/code> (Inversion of Control, \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f):<\/p>\n<pre><code>class IoC {     \/\/ Static     private static var instance:IoC;     public static function getInstance():IoC     {         if (instance == null)         {             instance = new IoC();         }         return instance;     }     \/\/ Settings     private var realTypeByTypeName:Map&lt;String, Class&lt;Dynamic>> = new Map();      public function new()     {         if (instance != null)         {             throw new Exception(\"Singleton class can have only one instance!\");         }         instance = this;     }     public function register&lt;T>(type:Class&lt;T>, realType:Class&lt;T>):Void     {         var typeName = Type.getClassName(type);         realTypeByTypeName[typeName] = realType;     }     public function create&lt;T>(type:Class&lt;T>, ?args:Array&lt;Dynamic>):T     {         if (type == null)         {             return null;         }         var typeName = Type.getClassName(type);         var realType = realTypeByTypeName[typeName];         if (realType == null)         {             realType = type;         }         return Type.createInstance(realType, args);     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u0442\u0438\u043f\u043e\u0432, \u0442\u043e \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e (<code>create()<\/code>). \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043e\u0442\u043e\u0432\u0441\u044e\u0434\u0443, <code>IoC<\/code> \u0441\u0434\u0435\u043b\u0430\u043d \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u043e\u043c. \u0412\u0441\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 <code>Type.createInstance()<\/code>, \u0430 \u0447\u0435\u0440\u0435\u0437 <code>IoC.getInstance().create()<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 <code>create()<\/code> \u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u043d\u0435\u0442, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0435:<\/p>\n<pre><code>class Component {     private var ioc = IoC.getInstance();     \/\/...     private function createComponent&lt;T>(type:Class&lt;T>):T     {         return ioc.create(type);     } } class Main extends Sprite {     public function new()     {     var ioc = IoC.getInstance();         ioc.register(SettingsPanel, SettingsPanel2);         \/\/ ...     } \/\/ ... }<\/code><\/pre>\n<p>\u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 <strong>\u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/strong> (<a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/manual_ru\/01_client_13.md\" rel=\"noopener noreferrer nofollow\">Inversion of Control<\/a>)? \u0412 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u0445 \u0442\u0438\u043f\u044b. \u041d\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u0435\u0440\u0435\u043f\u043e\u0440\u0443\u0447\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 \u2014 IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443 \u2014 \u0430 \u0441\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434 <code>create()<\/code>, \u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430\u0440\u0443\u0436\u0443. \u0423\u0436\u0435 \u043d\u0435 \u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0435 \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0430 IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0430, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438 \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e, \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430: \u0438\u0437 <code>Main<\/code> \u0438\u043b\u0438 \u0432\u043e\u0432\u0441\u0435 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433-\u0444\u0430\u0439\u043b\u0430 (xml, yml).<\/p>\n<p>\u0412 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0435\u043c \u0436\u0435 IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u0438\u043f\u043e\u0432 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" rel=\"noopener noreferrer nofollow\">Dependency Injection<\/a>, DI). \u0422\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043d\u0435\u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0441\u0435 \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u0435\u0439\u0448\u0430\u044f \u043c\u0430\u0433\u0438\u044f: \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435, \u043d\u043e \u043f\u0440\u0438 \u0432\u0441\u0435\u043c \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0436\u0435 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043d\u0435\u0432\u0435\u0434\u043e\u043c\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u041a\u0430\u043a? \u041f\u043e\u0447\u0435\u043c\u0443? \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0431\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u043c\u0443 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043c\u043e\u0440\u043e\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0433\u043e\u043b\u043e\u0432\u0443, \u0438 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043a\u0430\u043f\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0441\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0438 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u2014 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>create()<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043e\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0440\u0430\u0434\u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u0432\u0441\u0435 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0438 \u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<pre><code>class Screens {     \/\/ Static     private static var instance:Screens;     public static function getInstance():Screens     {         if (instance == null)         {             instance = IoC.getInstance().create(Screens);         }         return instance;     }     \/\/... } <\/code><\/pre>\n<p>\u0410 \u0440\u0430\u0437 \u0442\u0430\u043a, \u0442\u043e \u0441\u0430\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0438\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 IoC:<\/p>\n<pre><code>class IoC {     \/\/...     public function getSingleton&lt;T>(type:Class&lt;T>):T     {         if (type == null)         {           return null;         }         var typeName = Type.getClassName(type);         \/\/ Get         var instance = singletonByTypeName[typeName];         if (instance == null)         {             \/\/ Create             instance = create(type);             \/\/ Save by base type             singletonByTypeName[typeName] = instance;             \/\/ Save also by current type             var currentType = Type.getClass(instance);             var currentTypeName = Type.getClassName(currentType);             singletonByTypeName[currentTypeName] = instance;         }         return cast instance;     } }<\/code><\/pre>\n<pre><code>class Main extends Sprite {     public function new()     {         super();         var ioc = IoC.getInstance();         \/\/ Config         ioc.register(SettingsPanel, SettingsPanel2);         \/\/ Start         var screens:Screens = ioc.getSingleton(Screens)         screens.skin = this;     } }<\/code><\/pre>\n<h2>\u041a\u043e\u043d\u0444\u0438\u0433<\/h2>\n<p>\u041d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435. \u0412\u043e\u0432\u0441\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0443\u0436\u0434\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0446\u0435\u043b\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435\u0433\u043e-\u043d\u0430\u0432\u0441\u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043f\u0430\u0440\u044b \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u0420\u0430\u0437 \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0443\u0442 \u0436\u0435 \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/d_managers\/client_haxe\/src\/v4\/lib\/IoC.hx\" rel=\"noopener noreferrer nofollow\">IoC<\/a> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"yaml\">LangPanel:     skinPath: \"\"<\/code><\/pre>\n<pre><code>class IoC {     \/\/...     public function load(assetName:String=null):Void     {     \/\/ ...     }     public function create&lt;T>(type:Class&lt;T>):T     {         if (type == null)         {             return null;         }         var typeName = Type.getClassName(type);         var realType = realTypeByTypeName[typeName];         var result = Type.createInstance(realType != null ? realType : type, []);         applyConfig(result, typeName, realType);         return result;     }     private function applyConfig&lt;T>(result:T, typeName:String, ?realType:Class&lt;Dynamic>):Void     {       \/\/ ...     } }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c LangPanel \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 <code>skinPath<\/code> \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>\"\"<\/code>. \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0438\u043c\u0435\u043d, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<pre><code class=\"yaml\">SettingsPanel:     langPanel.skinPath: \"\"<\/code><\/pre>\n<pre><code class=\"yaml\">Menu:     settingsPanel.langPanel.skinPath: \"\"<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u0445 \u043e\u0434\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>super<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"yaml\">MenuBase:     settingsPanel.langPanel.skinPath: \"\" Menu:     super: MenuBase<\/code><\/pre>\n<p>\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u2014 \u043b\u0438\u0448\u044c \u0431\u044b \u043e\u043d\u0430 \u043d\u0435\u0437\u0430\u043a\u043e\u043b\u044c\u0446\u043e\u0432\u044b\u0432\u0430\u043b\u0430\u0441\u044c.<\/p>\n<h2>\u0421\u0435\u0430\u043d\u0441 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0433\u0440\u044b (MultiApplication)<\/h2>\n<p>\u0421 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (IoC) \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u0433\u043a\u043e \u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u0434 \u043d\u0430\u0448\u0438 \u043d\u0443\u0436\u0434\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u0438\u043b\u0438 \u043f\u043e\u0434\u043c\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u043e\u0432. IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c \u0432\u0441\u0435 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438.<\/p>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u0432\u0435 \u0438\u0433\u0440\u044b (\u0447\u0442\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0448\u0430\u0445\u043c\u0430\u0442 \u0438\u043b\u0438 \u043f\u043e\u043a\u0435\u0440\u0430), \u0442\u043e \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0435\u043c\u0441\u044f \u0441 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/manual_ru\/01_client_14.md\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438<\/a>. \u0418\u0433\u0440\u044b \u0431\u0443\u0434\u0443\u0442 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/tree\/main\/h_loader\/client_haxe\/src\/\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/a> \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043d\u043e\u0432, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0441 \u0441\u043e\u043a\u0435\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0433\u0440\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438\u043b\u0438, \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p>\u041c\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>IoC.getSingleton()<\/code> \u2014 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <code>IoC<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u044f\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u0438 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438. \u0418 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0447\u0435\u043c \u0432\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434 <code>create()<\/code> \u043d\u0435 \u043d\u0430\u0439\u0442\u0438. <code>IoC<\/code> \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f \u0432\u0441\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c, \u0438\u043c\u0435\u044e\u0449\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>ioc<\/code>:<\/p>\n<pre><code>class IoC {     \/\/...     public function create&lt;T>(type:Class&lt;T>):T     {         if (type == null)         {             return null;         }         var typeName = Type.getClassName(type);         var realType = realTypeByTypeName[typeName];         var result = Type.createInstance(realType != null ? realType : type, []);         if (Reflect.hasField(result, \"ioc\"))         {             Reflect.setProperty(result, \"ioc\", this);         }         applyConfig(result, typeName, realType);         return result;     } } <\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u0430\u0441 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>IoC.getSingleton()<\/code> \u0432 \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043d\u043e \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 &#171;\u043c\u0443\u043b\u044c\u0442\u0438\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435&#187;, \u043f\u0440\u0438 \u0442\u043e\u043c \u0432\u0441\u0435\u0433\u043e \u0432 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u044f \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>ioc<\/code>, \u0438 \u0442\u0443\u0442 \u0436\u0435 \u0442\u0435\u0440\u044f\u0435\u0442 \u044d\u0442\u0443 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0435\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438, \u0442\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 <code>ioc<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441\u043e \u0441\u043a\u0438\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c <code>ioc<\/code> \u0432 \u0432\u0438\u0434\u0435 \u0441\u0435\u0442\u0442\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>init()<\/code> \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 <code>dispose()<\/code> \u2014 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u0442\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u0435\u0433\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>Base<\/code>:<\/p>\n<pre><code>class Base {     \/\/ State     private var ioc(default, set):IoC;     private function set_ioc(value:IoC):IoC     {         if (ioc != value)         {             if (ioc != null)             {                 \/\/ (To prevent calling set_ioc() again on ioc=null in dispose())                 ioc = null;                 \/\/ Dispose previous state                 dispose();             }             \/\/ Set             ioc = value;             if (ioc != null)             {                 \/\/ Initialize                 init();             }         }         return value;     }     \/\/ Override to change defaults and other settings which should be set only once     public function new()     {     }     \/\/ Override for initialization (create\/get instances using IoC)     private function init():Void     {     }     \/\/ Override to revert changes of init and clear up the memory     public function dispose():Void     {         ioc = null;     } } class Component extends Base {     \/\/ ... } class IoC extends Base {     \/\/...     public function new()     {         super();         ioc = this;     }     override public function dispose():Void     {         for (instance in singletonByTypeName)         {             var base = Std.downcast(instance, Base);             if (base != null &amp;&amp; base != this)             {                 base.dispose();             }         }         super.dispose();     } }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>init()<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 <code>ioc<\/code> \u0443\u0436\u0435 \u0437\u0430\u0434\u0430\u043d (\u043d\u0435 \u0440\u0430\u0432\u0435\u043d <code>null<\/code>). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041c\u0435\u0442\u043e\u0434 dispose() \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d <code>init()<\/code> \u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 <code>init()<\/code>.<\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c <code>IoC<\/code> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442 <code>Base<\/code>. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>dispose()<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b \u043f\u0440\u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u042d\u0442\u0438\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u043a\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b, \u0442\u043e\u0442 \u0438 \u043d\u0435\u0441\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435. IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0438\u0433\u0440.<\/p>\n<h2>\u0421\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/h2>\n<h3>\u0421\u0438\u0433\u043d\u0430\u043b\u044b<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0443\u043a\u043b\u044e\u0436\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b <a href=\"https:\/\/api.openfl.org\/openfl\/events\/Event.html\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/a> <a href=\"https:\/\/www.openfl.org\/\" rel=\"noopener noreferrer nofollow\">OpenFL<\/a> (<a href=\"https:\/\/help.adobe.com\/ru_RU\/FlashPlatform\/reference\/actionscript\/3\/flash\/events\/Event.html\" rel=\"noopener noreferrer nofollow\">Flash<\/a>), \u043c\u044b \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u043c\u0438. \u0421\u0438\u0433\u043d\u0430\u043b\u044b \u2014 \u044d\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043b\u0431\u0435\u043a\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/c_screens\/client_haxe\/src\/v1\/lib\/Signal.hx\" rel=\"noopener noreferrer nofollow\">Signal<\/a>. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432 \u043d\u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u044b: <code>dispatch()<\/code>, <code>add()<\/code>, <code>remove()<\/code>:<\/p>\n<pre><code>class Signal&lt;T> {     private var listeners = new Array&lt;(T)->Void>();     public function add(listener:(T)->Void):Void     {         if (listener != null &amp;&amp; !listeners.contains(listener))         {             listeners.push(listener);         }     }     public function remove(listener:(T)->Void):Void     {         if (listener != null)         {             listeners.remove(listener);         }     }     public function dispose():Void     {         listeners.resize(0);     }     public function dispatch(target:T):Void     {         \/\/ Traverse listeners' copy, because some listeners could be         \/\/ added or removed during dispatching and the list would change         for (listener in listeners.copy())         {             listener(target);         }     } }<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:<\/p>\n<ol>\n<li>\n<p>\u041c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 <a href=\"https:\/\/api.openfl.org\/openfl\/events\/EventDispatcher.html\" rel=\"noopener noreferrer nofollow\">EventDispatcher<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 <code>Event<\/code> \u0434\u043b\u044f \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u043b\u0443\u0448\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441 \u043d\u043e\u0432\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441. \u0412 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u0445 \u0442\u0438\u043f\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0430 \u0438\u043c\u0435\u043d\u0430 \u2014 \u0432 \u0441\u0430\u043c\u0438\u0445 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f\u0445 (\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445).<\/p>\n<\/li>\n<\/ol>\n<pre><code>class Button extends Component {     public var clickSignal(default, null) = new Signal&lt;Button>; \/\/ handler(target:Button):Void     \/\/...     private function interactiveObject_clickHandler(event:MouseEvent):Void     {         clickSignal.dispatch(this);     } } class Dialog extends Component {     \/\/...     private var closeButton:Button;     public function new()     {         super();         closeButton = new Button();         closeButton.skinPath = \"closeButton\";         closeButton.clickSignal.add(closeButton_clickSignalHandler);         addChild(closeButton);     }     \/\/...     private function closeButton_clickSignalHandler(target:Button):Void     {     } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0438 2, 3, 4 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u043d\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0430 Signal \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<pre><code>class Signal2&lt;T1, T2> {     private var listeners = new Array&lt;(T1, T2)->Void>();     \/\/... } class Signal3&lt;T1, T2, T3> {     private var listeners = new Array&lt;(T1, T2, T3)->Void>();     \/\/... }<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0434\u0435\u043b\u0430\u044e\u0442 \u043d\u0430\u0448 \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u043c \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432: <code>add()<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>addEventListener(), dispatch()<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>dispatchEvent()<\/code> \u0438 \u0442.\u0434.<\/p>\n<h3>\u041b\u043e\u0433\u0438<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u043b\u043e\u0433\u0438 \u043f\u043e \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445, \u0431\u0443\u0434\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e <code>trace()<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441-\u043e\u0431\u0435\u0440\u0442\u043a\u0443 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/c_screens\/client_haxe\/src\/v3\/lib\/Log.hx\" rel=\"noopener noreferrer nofollow\">Log<\/a>:<\/p>\n<pre><code>class Log {     \/\/ Settings     public static var isDebug = true;     public static var isInfo = true;     \/\/ Methods     public static function debug(message:Dynamic, ?posInfo:PosInfos):Void     {         if (isDebug)         {             Log.trace(\"debug: \" + message, posInfo);         }     }     public static function info(message:Dynamic, ?posInfo:PosInfos):Void     {         if (isInfo)         {             Log.trace(message, posInfo);         }     }     public static function warn(message:Dynamic, ?posInfo:PosInfos):Void     {         Log.trace(\"WARNING! \" + message, posInfo);     }     public static function error(message:Dynamic, ?posInfo:PosInfos):Void     {         Log.trace(\"ERROR!! \" + message, posInfo);     }     public static function fatal(message:Dynamic, ?posInfo:PosInfos):Void     {         Log.trace(\"FATAL!!! \" + message, posInfo);     }     private static dynamic function trace(v:Dynamic, infos:PosInfos):Void {         #if (fdb || native_trace)         var str = haxe.Log.formatOutput(v, infos);         untyped __global__[\"trace\"](str);         #else         flash.Boot.__trace(v, infos);         #end     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043b\u043e\u0433\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u043d\u0435 \u0432\u043d\u043e\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0438\u043f\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0441\u043e\u0431\u044b\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c (&#171;WARNING!&#187;, &#171;ERROR!! &#171;, &#171;FATAL!!!&#187;). \u041f\u043e\u043a\u0430 \u0432\u0435\u0437\u0434\u0435 \u0432 \u043a\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 <code>Log<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043b\u043e\u0433\u043e\u0432 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u043f\u043e\u043b\u043d\u044b\u043c \u043d\u0430\u0448\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c.<\/p>\n<p>\u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u043b\u043e\u0433\u043e\u0432, \u043a\u043b\u0430\u0441\u0441 <code>Log<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code>Log.set(\"default\", Log.INFO) Log.set(\"managers\", Log.DEBUG) \/\/ ... var log = Log.get(\"managers\"); log.debug(\"Play sound\");<\/code><\/pre>\n<p>\u0418\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: <code>Log.get(\"default\")<\/code>.<\/p>\n<h3>\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b<\/h3>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445, \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0438 \u043e\u0431\u0449\u0438\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0421\u044e\u0434\u0430 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0437\u0432\u0443\u043a\u0438, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043d\u0430 \u0432\u0441\u0451 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430\u043c\u0438.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0412 OpenFL \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/api.openfl.org\/openfl\/utils\/Assets.html\" rel=\"noopener noreferrer nofollow\">Assets<\/a>. \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u043e\u0434\u0435 \u0432\u043b\u0435\u0447\u0435\u0442 \u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e, \u0447\u0442\u043e \u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u043e\u0434 \u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 <code>Assets<\/code> \u2014 <strong>ResourceManager<\/strong>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u0430\u0441\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u0430\u0441\u0441\u0435\u0442\u043e\u0432, \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/c_screens\/client_haxe\/src\/v3\/lib\/ResourceManager.hx\" rel=\"noopener noreferrer nofollow\">ResourceManager<\/a> \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0435 API (<code>createMovieClip()<\/code>) \u043d\u0430 \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438: \u0438 \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b, \u0438 \u043a\u043e\u0433\u0434\u0430 \u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c:<\/p>\n<pre><code>class ResourceManager extends Base { \/\/ ...     public function createMovieClip(assetName:String, callback:(MovieClip) -> Void):Void     {         if (assetName == null || assetName == \"\")         {             callback(null);             return;         }         if (assetName == \"MovieClip\" || assetName == \"openfl.display.MovieClip\")         {             callback(new MovieClip());             return;         }         \/\/ Get         var movieClip = getMovieClip(assetName);         if (movieClip != null)         {             callback(movieClip);             return;         }         \/\/ Load         var libraryName = getLibraryName(assetName);         loadLibrary(libraryName, function(libraryName:String):Void         {             var movieClip = Assets.getMovieClip(assetName);             callback(movieClip);         });   }     public function getMovieClip(assetName:String):MovieClip     {         if (assetName == null || assetName == \"\")         {           return null;         }         var libraryName = getLibraryName(assetName);         if (!loadedLibraries.contains(libraryName))         {             \/\/ Not loaded yet             return null;         }         return Assets.getMovieClip(assetName);     }     private function getLibraryName(assetName:String):String     {         return assetName.indexOf(\":\") != -1 ? assetName.split(\":\")[0] : \"default\";     }     public function getSound(assetName:String):Sound     {         \/\/ As sounds and music are not necessary part of game, ignore if they absent         try         {             return Assets.getSound(assetName);         }         catch (e:Exception)         {             return null;         }     }     public function getData(assetName:String):Dynamic     {         var texttext = Assets.getText(assetName);         var nameParts = assetName.split(\".\");         var ext = nameParts.length > 1 ? nameParts[nameParts.length - 1] : \"\";         switch (ext)         {             case \"json\":               return Json.parse(text);             \/\/ Add \"&lt;haxelib name=\"yaml\"\/>\" to project.xml             case \"yml\" | \"yaml\":               return Yaml.parse(text, new ParserOptions().useObjects());         }         return text;     } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0437\u0432\u0443\u043a\u043e\u0432 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438\u0445 \u043d\u0430\u043b\u0438\u0447\u0438\u0435, \u0430 \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e <code>Assets<\/code> \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0438\u0433\u0440\u0430\u0445.<\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c <strong>AudioManager<\/strong> \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 <code>isSoundOn<\/code>, <code>isMusicOn<\/code>, <code>isAudioOn<\/code> (\u0432\u043a\u043b\/\u0432\u044b\u043a\u043b), <code>soundVolume<\/code>, <code>musicVolume<\/code>, <code>audioVolume<\/code> (\u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c) \u0438 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/d_managers\/client_haxe\/src\/v3\/lib\/AudioManager.hx\" rel=\"noopener noreferrer nofollow\">\u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438<\/a> <code>playSound()<\/code>, <code>playMusic()<\/code>, <code>stopAllSounds()<\/code>, <code>stopMusic()<\/code>. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 <code>SharedObject<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0442\u0443\u0434\u0430. \u0422\u0430\u043a, \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c\u0441\u044f, \u0438 \u0435\u043c\u0443 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435.<\/p>\n<p>\u0417\u0432\u0443\u043a\u0438 (sound) \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043c\u0443\u0437\u044b\u043a\u0438 (music) \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430. \u0422\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>playMusic()<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u043b\u0435\u0439\u043b\u0438\u0441\u0442 \u0438\u0437 \u0442\u0440\u0435\u043a\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438). \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (\u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c, \u0431\u0430\u043b\u0430\u043d\u0441, \u0438\u043c\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0438 \u0442.\u0434.) \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c yml-\u0444\u0430\u0439\u043b\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430:<\/p>\n<pre><code class=\"yaml\">isSoundOn: false #isMusicOn: true soundVolume: 0.7 musicVolume: .3  sound:   click_button:  # Default soundName in Button   name: click_sound  # Real audio file name in assets     pan: -1 music:   track1:     # name: track1  # By default     pan: -1   track2:     name: music2     volume: .85   music_menu:  # Playlist \"music_menu\" could be default musicName value in MenuScreen     name: [track1, track2, music3]     isLoop: true     volume: .75<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0437\u0432\u0443\u043a\u0438 \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0415\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442 \u0432 \u0430\u0441\u0441\u0435\u0442\u0430\u0445, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0430 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043d\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0432\u0443\u043a\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0432 \u043a\u043e\u0434. \u041d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0437\u0432\u0443\u043a\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/p>\n<pre><code>class Button extends Component {     \/\/ Settings     public var soundClick = \"click_button\";     \/\/ ...     private function interactiveObject_clickHandler(event:MouseEvent):Void     {         audioManager.playSound(soundClick);         clickSignal.dispatch(this);     } }<\/code><\/pre>\n<p>\u0412\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c yml-\u0444\u0430\u0439\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b \u0432\u0441\u0435\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u041f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <strong>LangManager<\/strong>. \u0412 \u043d\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0432\u0443\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432: <code>load()<\/code> \u0438 <code>get()<\/code> \u0438 \u0434\u0432\u0443\u0445 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/d_managers\/client_haxe\/src\/v3\/lib\/LangManager.hx\" rel=\"noopener noreferrer nofollow\">\u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/a>: <code>langs<\/code> \u0438 <code>currentLang<\/code>. \u041d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439 \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430\u043c\u0438.<\/p>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/d_managers\/client_haxe\/src\/v3\/lib\/components\/Label.hx\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442<\/a> (<code>Label<\/code>). \u041f\u0443\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u043e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u043b, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u043f\u0430\u0440\u0441\u0438\u043b \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 (<code>TextField<\/code>) \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u043b \u0435\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (<code>textField.text = new UTF8String(text);<\/code>). \u041d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 <code>LangManager<\/code> \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430\u043c\u0438:<\/p>\n<pre><code>class Label extends Component {     \/\/ State     \/\/ private var langManager:LangManager; \/\/ Defined in Component     private var textField:TextField;     public var text(default, set):String;     public function set_text(value:String):String     {         if (text != value)         {             text = value;             refreshText();         }         return value;     }     public var actualText(default, null):String;      override private function assignSkin():Void     {         super.assignSkin(); textField = Std.downcast(skin, TextField);         langManager.currentLangChangeSignal.add(langManager_currentLangChangeSignalHandler); refreshText();     }     override private function unassignSkin():Void     {         langManager.currentLangChangeSignal.remove(lang_currentLangChangeSignalHandler);         textField = null;         super.unassignSkin();     }     private function refreshText():Void     {         actualText = langManager.get(text);         if (textField != null &amp;&amp; actualText != null)         {             textField.text = new UTF8String(actualText);         }     }     private function langManager_currentLangChangeSignalHandler(currentLang:String):Void     {         refreshText();     } }<\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u0432 \u043a\u043e\u0434\u0435: <code>label.text = \"Sound volume:\";<\/code> \u0432 yml: <code>\"Sound volume:\": \"\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u043a\u0430:\"<\/code>):<\/p>\n<pre><code class=\"yaml\">currentLang: en langs: [\"en\", \"ru\", \"de\"] en:     Dressing: Dress Up  # Fix hardcoded text ru:     Managers: \u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b     Dressing: \u041e\u0434\u0435\u0432\u0430\u043b\u043a\u0430     \"Sound volume:\": \"\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u043a\u0430:\"     \"Music volume:\": \"\u0413\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u043c\u0443\u0437\u044b\u043a\u0438:\"<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0442\u0435\u043a\u0441\u0442 \u0432\u0434\u0440\u0443\u0433 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0437\u0442\u044c \u0432 \u043a\u043e\u0434. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c &#171;\u043f\u0435\u0440\u0435\u0432\u043e\u0434&#187; \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u044f\u0437\u044b\u043a (<code>\"Dressing\": \"Dress Up\"<\/code>). \u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438, \u0442\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043b\u044e\u0447\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>\"@\"<\/code>:<\/p>\n<pre><code class=\"yaml\">en:     \"@menu_title\": Managers ru:     \"@menu_title\": \u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/d_managers\/client_haxe\/src\/v3\/lib\/components\/LangButton.hx\" rel=\"noopener noreferrer nofollow\">LangButton<\/a>, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0442 <code>RadioButton<\/code>. \u0410 \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/d_managers\/client_haxe\/src\/v3\/lib\/components\/LangPanel.hx\" rel=\"noopener noreferrer nofollow\">LangPanel<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u044f\u0437\u044b\u043a\u0430\u0445 \u0432 <code>LangManager<\/code>, \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 <code>LangButton<\/code>, \u0430 \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u2014 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>langButton.language = langManager.langs[i];<\/code>.<\/p>\n<h3>Application<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043d\u043e\u0432 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0432\u0441\u0435\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043a\u043b\u0430\u0441\u0441 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/h_loader\/client_haxe\/src\/v2\/lib\/Application.hx\" rel=\"noopener noreferrer nofollow\">Application<\/a>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 <code>Main<\/code>-\u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0442 <code>Application<\/code> \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u0441\u0435 <code>Main<\/code>-\u043a\u043b\u0430\u0441\u0441\u044b.<\/p>\n<pre><code>class Application extends Sprite {     \/\/ Settings     private var startScreenClass:Class&lt;Screen>;      public function new()     {         super();         init();     }     private function init():Void     {         var ioc = new IoC();         configureApp();         var langManager = ioc.getSingleton(LangManager);         var audioManager = ioc.getSingleton(AudioManager);         langManager.load();         audioManager.load();         var screens = ioc.getSingleton(Screens);         screens.skin = this;         screens.open(startScreenClass);     }     \/\/ Override     private function configureApp():Void     {     } } class Main extends Application { }<\/code><\/pre>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u0412\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u043d\u0435\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e\u0441\u043b\u0443\u0436\u0430\u0442 \u043d\u0430\u043c \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0438\u0433\u0440. \u0410 \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0437\u0430\u0434\u0430\u044e\u0442 \u043e\u0431\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0434\u0430\u043d\u043d\u0443\u044e <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/tree\/main\/i_framework\/client_haxe\/src\/v1\" rel=\"noopener noreferrer nofollow\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443<\/a> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/manual_ru\/00_intro_01.md\" rel=\"noopener noreferrer nofollow\">\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c<\/a> (\u0430\u043d\u0433\u043b. \u043a\u0430\u0440\u043a\u0430\u0441). \u0415\u0441\u043b\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u2014 \u044d\u0442\u043e \u0441\u043a\u0435\u043b\u0435\u0442, \u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u2014 \u044d\u0442\u043e \u043c\u044b\u0448\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a \u043d\u0435\u043c\u0443 \u043a\u0440\u0435\u043f\u044f\u0442\u0441\u044f, \u0430 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b \u2014 \u043e\u0440\u0433\u0430\u043d\u044b. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439.<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/677312\/\" rel=\"noopener noreferrer nofollow\"><u>&lt; \u041d\u0430\u0437\u0430\u0434<\/u><\/a>\u00a0|\u00a0<a href=\"https:\/\/habr.com\/ru\/post\/674754\/\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0447\u0430\u043b\u043e<\/a> | \u0412\u043f\u0435\u0440\u0435\u0434 > <\/p>\n<p><a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/tree\/main\/\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/a><\/p>\n<p><a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/tree\/main\/manual_ru\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 (\u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445)<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/677386\/\"> https:\/\/habr.com\/ru\/post\/677386\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><a href=\"https:\/\/habr.com\/ru\/post\/677312\/\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0432<\/a> \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043c\u0435\u043d\u0443 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438 \u043f\u043e\u043a\u0430\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432. \u041f\u043e\u0442\u043e\u043c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (IoC). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0433\u0440 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0435\u0430\u043d\u0441\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0433\u0440\u044b, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u0430\u0445 \u0438\u043b\u0438 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d-\u043f\u043e\u043a\u0435\u0440\u0435. \u041f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0437\u0432\u0443\u043a\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043b\u043e\u0433\u043e\u0432 \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u043d\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c <a href=\"https:\/\/api.openfl.org\/openfl\/events\/Event.html\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c<\/a>.<\/p>\n<p>\u0412\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0444\u043e\u0440\u043c\u0438\u0432\u0448\u0438\u043c\u0441\u044f \u0438\u0433\u0440\u043e\u0432\u044b\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c. <\/p>\n<h2>\u0421\u043a\u0440\u0438\u043d\u044b<\/h2>\n<p>\u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0440\u0430\u043d \u043c\u0435\u043d\u044e. \u041f\u043e\u0441\u043b\u0435 \u043a\u043b\u0438\u043a\u0430 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;\u041d\u0430\u0447\u0430\u0442\u044c \u0438\u0433\u0440\u0443&#187; \u044d\u043a\u0440\u0430\u043d \u043c\u0435\u043d\u044e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0440\u0430\u043d \u0438\u0433\u0440\u044b. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u043c\u0435\u043d\u044b \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435. \u041d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/tree\/main\/c_screens\/client_haxe\/src\" rel=\"noopener noreferrer nofollow\">Screens<\/a>. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043a\u0438\u043d\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>Main<\/code>:<\/p>\n<pre><code>class Main extends Sprite {     public function new()     {         super();         new Screens(this);     } }<\/code><\/pre>\n<pre><code>class Screens extends Component { \/\/ State     private static var instance:Screens;     public static function getInstance():Screens     {         if (instance == null)         {             instance = new Screens();         }         return instance;     }     public var currentScreen(default, null):Screen;     private var currentScreenClass:Class&lt;Screen>;      \/\/ Init     public function new()     {         super();         if (instance != null)         {             throw new Exception(\"Singleton class can have only one instance!\");         }         \/\/ Should be set only once         instance = this;     }     override public function dispose():Void     {         if (currentScreen != null)         {             currentScreen.dispose();             currentScreen = null;         }         super.dispose();     }     \/\/ Methods     public function open(type:Class&lt;Screen>):Screen     {         if (currentScreenClass == type)         {             \/\/ Skip same             return currentScreen;         }         close(currentScreen);         \/\/ Open new         currentScreenClass = type;         currentScreen = Std.downcast(_open(cast type), Screen);         \/\/ Move new screen to the bottom, under all global dialogs (and other elements if any)         moveToBottom(currentScreen);         return currentScreen;     }      private function _open(type:Class&lt;Component>):Component     {         if (type == null)         {           return null;         }         \/\/ Get or create         var instance:Component = createComponent(type);         \/\/ Add         addChild(instance);         return instance;     }     \/\/ For both screens and dialogs     public function close(instance:Component):Void     {         if (instance == null)         {           return;         }         \/\/ Remove         if (instance == currentScreen)         {             currentScreen = null;             currentScreenClass = null;             \/\/ Dispose             instance.dispose();         }     }     private function moveToBottom(component:Component):Void     {         if (component != null &amp;&amp; component.skin != null &amp;&amp; component.skin.parent != null)         {           component.skin.parent.addChildAt(component.skin, 0);         }     } }<\/code><\/pre>\n<p>\u0421\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043d \u043c\u043e\u0436\u043d\u043e \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435: <code>Screens.getInstance().open(MenuScreen);<\/code>.<\/p>\n<h2>\u0414\u0438\u0430\u043b\u043e\u0433\u0438<\/h2>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441\u043a\u0440\u0438\u043d\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/tree\/main\/e_dialogs\/client_haxe\/src\" rel=\"noopener noreferrer nofollow\">\u0434\u0438\u0430\u043b\u043e\u0433\u0438<\/a>. \u0414\u0438\u0430\u043b\u043e\u0433\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0441\u043a\u0440\u0438\u043d\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0441\u043a\u0440\u0438\u043d, \u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u2014 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u2014 <code>openDialog()<\/code>. <\/p>\n<p>\u0414\u0438\u0430\u043b\u043e\u0433\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432: \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435. \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>Screens<\/code>, \u0432\u0442\u043e\u0440\u044b\u0435 \u2014 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043d. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u043a\u0440\u0438\u043d\u043e\u043c, \u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0430\u043a \u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0438\u0441\u0435\u0442\u044c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0438\u0445 \u043d\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0448\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0415\u0449\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u043b \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0438, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0435\u0433\u043e \u0441\u043a\u0438\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0430\u043c\u044b\u0439 \u043d\u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (display list). \u0412\u043e\u0442, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432:<\/p>\n<pre><code>class Screens extends Component {     \/\/ State     \/\/ ...     private var dialogStack:Array&lt;Component> = []; \/\/ To disable all under modal     private var localDialogs:Array&lt;Component> = []; \/\/ To close dialogs related to previous screen      \/\/ Init     override public function dispose():Void     {         for (dialog in dialogStack)         {           dialog.dispose();         }         dialogStack.resize(0);         localDialogs.resize(0);         \/\/ ...     }     \/\/ Methods     public function open(type:Class&lt;Screen>):Screen     {         if (currentScreenClass == type)         {             \/\/ Skip same             return currentScreen;         }         \/\/ Close previous         for (dialog in localDialogs)         {             close(dialog);         }         \/\/ ...     }     public function openDialog(type:Class&lt;Component>, ?global:Bool):Component     {         var dialog = _open(type);         if (dialog == null)         {           return null;         }         dialogStack.push(dialog);         if (!global)         {           localDialogs.push(dialog);         }         return dialog;     }      \/\/ For both screens and dialogs     public function close(instance:Component):Void     {         if (instance == null)         {             return;         }         \/\/ Remove         if (instance == currentScreen)         {             currentScreen = null;             currentScreenClass = null;             \/\/ Dispose             instance.dispose();         }         if (dialogStack.remove(instance))         {             \/\/ Dispose             instance.dispose();         }         localDialogs.remove(instance);     } }<\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043a\u0440\u0438\u043d\u0430 \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c <code>assetName<\/code>. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e <code>Screen<\/code> \u0438 <code>Dialog<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a \u043a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f (<code>closeButton<\/code>), \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0443\u0437\u044b\u043a\u0438, \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u0438 \u0442.\u0434.<\/p>\n<p>\u0421\u043a\u0440\u0438\u043d\u044b \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 <code>assetName<\/code>. \u041e\u043d\u0438 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432-\u043f\u0430\u043d\u0435\u043b\u0435\u0439, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0445 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0441\u0442\u043e\u044f\u0442 \u0441\u0430\u043c\u0438 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u0445, \u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043a\u0438\u043d\u0430. \u0418 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438 UI-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0432\u043e\u0439 \u0441\u043a\u0438\u043d \u043f\u043e <code>skinPath<\/code>.<\/p>\n<h2>\u0418\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (IoC)<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0443 \u043d\u0430\u0441 <code>Screens<\/code>. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u043a\u0440\u0438\u043d\u043e\u0432 \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u0438 \u0441\u043a\u0440\u0438\u043d\u044b \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0434\u043b\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u043e\u043d\u0430 \u0438\u0433\u0440\u044b \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438\u043b\u0438 \u043a\u043e\u0435-\u0447\u0442\u043e \u0432 \u043b\u043e\u0433\u0438\u043a\u0435, \u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043d\u0430 \u0438\u043b\u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u0430. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>class MenuScreen2 extends MenuScreen {     override private function init():Void     {     settingsPanelClass = SettingsPanel2         super.init();     } } class SettingsPanel2 extends SettingsPanel {     override private function init():Void {         super.init();         langPanel.skinPath = \"\";     } }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0435\u0449\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>MenuScreen<\/code> \u043d\u0430 <code>MenuScreen2<\/code>, \u0447\u0442\u043e \u043f\u043e\u0432\u043b\u0435\u0447\u0435\u0442 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e \u0446\u0435\u043f\u043d\u043e\u0439 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u0435\u0449\u0435 \u0446\u0435\u043b\u044b\u0439 \u0448\u043a\u0432\u0430\u043b \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/p>\n<p>\u042f\u0441\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0437\u043c\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e \u0442\u043e, \u043a\u0430\u043a\u043e\u0439 \u0446\u0435\u043d\u043e\u0439 \u043e\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f, \u043d\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b \u0431\u044b \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0438\u043f\u044b. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441 \u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u0432 <code>Main<\/code>:<\/p>\n<pre><code>class SettingsPanel2 extends SettingsPanel {     override private function init():Void {         super.init();         langPanel.skinPath = \"\";     } } class Main extends Sprite {     public function new()     {         registerSubstitution(SettingsPanel, SettingsPanel2);         \/\/ ...     } \/\/ ... }<\/code><\/pre>\n<p>\u041d\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043b\u0438 \u044d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u043d\u043e \u0441 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b? \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c? \u041c\u043e\u0436\u043d\u043e \u0438 \u043f\u0440\u0438 \u0442\u043e\u043c \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0443 \u043d\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>createComponent()<\/code>, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043d\u0435\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<pre><code>class MenuScreen extends Component {     \/\/...     private function init():Void     {         \/\/...         settingsPanel = createComponent(SettingsPanel);         \/\/...     }     \/\/... }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u0442\u0438\u043f\u043e\u0432, \u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e <code>Main<\/code>. \u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a Main \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0435\u0449\u0435 \u043a\u0443\u0447\u0443 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u0437\u043d\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u044d\u0442\u0443 \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u2014 <a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/blob\/main\/d_managers\/client_haxe\/src\/v3\/lib\/IoC.hx\" rel=\"noopener noreferrer nofollow\">IoC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<\/a>, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e <code>IoC<\/code> (Inversion of Control, \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f):<\/p>\n<pre><code>class IoC {     \/\/ Static     private static var instance:IoC;     public static function getInstance():IoC     {         if (instance == null)         {             instance = new IoC();         }         return instance;     }     \/\/ Settings     private var realTypeByTypeName:Map&lt;String, Class&lt;Dynamic>> = new Map();      public function new()     {         if (instance != null)         {             throw new Exception(\"Singleton class can have only one instance!\");         }         instance = this;     }     public function register&lt;T>(type:Class&lt;T>, realType:Class&lt;T>):Void     {         var typeName = Type.getClassName(type);         realTypeByTypeName[typeName] = realType;     }     public function create&lt;T>(type:Class&lt;T>, ?args:Array&lt;Dynamic>):T     {         if (type == null) <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-335961","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335961","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=335961"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335961\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=335961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=335961"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=335961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}