Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Инжект связей при компиляции (http://www.flasher.ru/forum/showthread.php?t=204118)

zaidite 20.10.2013 13:49

Инжект связей при компиляции
 
На сцене есть прямоугольник - Sprite.

Так же в проекте есть класс RotateSprite.

Код AS3:

public class RotateSprite extends Sprite 
{
    public function RotateSprite()
    {
          addEventListener(Event.ENTER_FRAME, _rotate);
    }
 
    private function _rotate (event:Event)
    {
          this.rotation += 1;
    }
 
}

Каким образом их можно связать друг с другом, чтобы при компиляции RotateSprite стал наследоваться именно от Sprite прямоугольника и начал бы крутить именно этот прямоугольник?

Или можно допустить, что существует некий третий класс, который при компиляции заинжектит связь...
Если такое возможно, то как это реализовать?

Какие либо махинации с метаданными?...

Ещё варианты?...

Конечная цель сего действия - крутящий прямоугольник на сцене. Код класса RotateSprite до момента компиляции и соответственно после компиляции - БЕЗ ИЗМЕНЕНИЙ!.

В RotateSprite дописывать руками ссылку на прямоугольник - нельзя!

Akopalipsis 20.10.2013 14:04

Цитата:

чтобы при компиляции RotateSprite стал наследоваться именно от Sprite прямоугольник
Подменить extends нельзя. Можно придумать миллион способов реализации, но это будет всё та же передача ссылки. Из - за слова Инжект в голову приходит, что Вы пользуетесь фраймворком, но там не все так просто.

Добавлено через 5 минут
Можно сделать "декорирования" или при добавлении в список отображения передавать прямоугольник в метод, где его будет крутить. Но это не будет подменой extends.

КорДум 20.10.2013 14:10

Такого инжекта в as3 нет. Если пользуетесь fla -> swc/swf в качестве библиотеки с ассетами, отнаследуйтесь от класса нужного мувиклипа, в котором и будет нарисован прямоугольник. Либо нарисуйте прямоугольник в graphics-контейнере экземпляра класса RotateSprite, либо создайте экземпляр прямоугольника в этом классе, либо передайте ссылку на этот прямоугольник и рулите им (композиция).

~~~ 21.10.2013 12:04

Товарищи, мне кажется, что вы забываете про управление / передачу контекста вызова. Например:
Код AS3:

_rotate.call(myTargetAsThis, event);

В AS3 полная свобода в плане динамики и полиморфизма: вы можете, например, расширять (наследоваться от) класса, который 1) расширяет Proxy; 2) подменяет контекст по вашему желанию. Таким образом можно реализовать хоть множественное наследование. Я уж не говорю про некое подобие конструирования классов и их экземпляров в рантайме ;)

samana 21.10.2013 12:14

А если просто расширить этот прямоугольник классом RotateSprite? Так можно?

Akopalipsis 28.10.2013 23:22

Цитата:

В AS3 полная свобода в плане динамики и полиморфизма: вы можете, например, расширять (наследоваться от) класса, который 1) расширяет Proxy; 2) подменяет контекст по вашему желанию.
Когда я в первые прочёл эти слова, то понял их слишком однозначно - что да, можно сделать множественное наследие. Но ведь невозможно сделать множественное наследие? По сути это будет класс в котором будут создаваться разные классы к свойствам которых можно добраться через геттер этого супер класса?

~~~ 28.10.2013 23:41

Разумеется, множественное наследование аналогично Пайтоновскому в AS3 так просто не получить. Да и зачем. Эзотерика это всё, но если очень надо - пожалуйста:
1. Вспоминаем реализацию наследования на прототипах, например, как в JS;
2. Смотрим вот это;
3. Примешиваем Proxy, контролируем каждый access & call, и перенаправляем куда надо, не забыв про подмену контекста исполнения;
4. Можно реализовать гетДеседентс и доступ к атрибутам ( ".." и "@" )
5. А ещё можно попытаться найти мой старенький MagicObject, замешанный как раз на Proxy. Там гордиться особо не чем, но идею объяснит.

Добавлено через 1 минуту
А вообще есть Haxe для таких вещей.

Добавлено через 7 минут
MagicObject & post.

Akopalipsis 28.10.2013 23:52

Цитата:

Эзотерика это всё, но если очень надо - пожалуйста:
Спасибо! Ответ знал, но не смог не спросить)


Часовой пояс GMT +4, время: 17:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.