Форум 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=185722)

AlexLucas 19.10.2012 14:49

Несовместимость абсолютно одинаковых интерфейсов
 
Доброго времени суток.
В основной проект я подгружаю флешку, в которой содержится mxml элемент класса TextTool (единственный такой элемент), который implements="IModule"
Код AS3:

package 
{
        import mx.core.UIComponent;
        public interface IModule
        {
                function getIcons():UIComponent;
        }       
}

Этот интерфейс присутствует как в главном проекте, так и в подгружаемом , находится прямо в корне проектов. При компиляции загружаемого проекта ошибки нет - TextTool правильно использует интерфейс.
В главном проекте, после подгрузки флэшки я достаю этот TextTool и смотрю если он подходит к интерфейсу IModule:
Код AS3:

trace(getQualifiedClassName(mySwf.getChildByName('textModule')['myTF']));       //stark::TextTool
trace(mySwf.getChildByName('textModule')['myTF'] is IModule);                        //false

Почему так?

caseyryan 19.10.2012 14:58

Потому что надо грузить в одну песочницу
в контекст загрузки надо указать тот же applicationDomain домен, что и у подгружающей флешки
Код AS3:

if (Security.sandboxType == Security.REMOTE) {
        var context:LoaderContext        = new LoaderContext();
        context.applicationDomain        = new ApplicationDomain(ApplicationDomain.currentDomain);
}

ну и указать этот контекст загрузчику. Тогда будет работать.

AlexLucas 19.10.2012 16:20

Я гружу локальный свф, так что подставил
Код AS3:

Security.sandboxType == Security.LOCAL_TRUSTED

Вот весь код
Код AS3:

var url:URLRequest = new URLRequest("../src/components/TextTool.swf");
                var ldr:SWFLoader = new SWFLoader();
                var context:LoaderContext        = new LoaderContext();
                if (Security.sandboxType == Security.LOCAL_TRUSTED) {
                        context.applicationDomain        = new ApplicationDomain(ApplicationDomain.currentDomain);
                        trace('here');
                }
 
                ldr.source = "../src/components/TextTool.swf";
                ldr.loaderContext = context;
                ldr.addEventListener(Event.COMPLETE, onLoadComplete);
                ldr.load();

Проверка на совместимость с интерфейсом всё так же false.

caseyryan 19.10.2012 17:28

Не может этого быть. Значит проблема с самим интерфейсом. У него точно такой же пакет? Такое же название? Такой же набор методов? Та же область видимости?

in4core 19.10.2012 17:30

Код AS3:

trace(mySwf.getChildByName('textModule')['myTF'] is IModule);

ЭЭЭ...

Код AS3:

trace(mySwf.getChildByName('textModule') is IModule);

maybe?

AlexLucas 19.10.2012 18:05

Цитата:

Сообщение от caseyryan (Сообщение 1100521)
Не может этого быть. Значит проблема с самим интерфейсом. У него точно такой же пакет? Такое же название? Такой же набор методов? Та же область видимости?

Код скопипастил, и там и там интерфейс в корне проекта, название то же. Уже много раз проверял.
Всё логично но не получатеся :*(

Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<!-- мэйн класс подгружаемого модуля  -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
                xmlns:stark="stark.*" name="textModule" >   
                <stark:TextTool name="myTF" id="myTF"></stark:TextTool>
    </s:Application>

А TextTool это мой кастомный класс который имплементит IModule. Так что myTF должен быть is IModule

caseyryan 19.10.2012 18:20

Цитата:

xmlns:fx="http://ns.adobe.com/mxml/2009"
пространство имен в подгружающей флешке такое же?

AlexLucas 19.10.2012 18:23

Да, такое же.

GBee 19.10.2012 21:19

Код AS3:

new ApplicationDomain(ApplicationDomain.currentDomain);

Это разве тот же домен?

i.o. 19.10.2012 21:33

Цитата:

Сообщение от GBee (Сообщение 1100546)
Код AS3:

new ApplicationDomain(ApplicationDomain.currentDomain);

Это разве тот же домен?

Кэп говорит - нет.

Попробуйте затестить с этим:
Код AS3:

context.applicationDomain = ApplicationDomain.currentDomain;


caseyryan 19.10.2012 21:55

Выразился я не правильно.
Сам объект-то будет другим, но приложение будет знать какой домен родительский.
Код с созданием нового объекта ApplicationDomain и указанием ему родительского аппдомена работает. Это копипаст из реального приложения, в котором так же подкружаемые флешки используют те же интерфейсы, что и подгружающая

КорДум 19.10.2012 22:15

http://www.flasher.ru/forum/showthread.php?t=184935

AlexLucas 22.10.2012 15:26

Вложений: 1
Спасибо , прочитал ту статью, перепробовал все варианты, в любом случае проверка возвращает false.
Я прицепил маленький проект, тут тоже проверка возвращает false. Посмотрите пожалуйста.

dimarik 22.10.2012 16:50

У меня дает true.

Добавлено через 5 минут
Только я пользовался одним общим ITest, а не разными в разных проектах. Может в этом дело?

AlexLucas 22.10.2012 17:23

Вы оставили ITest в Loader и удалили из Loaded и убрали оттуда implements="ITest"?

dimarik 22.10.2012 17:40

Я объединил два проекта в один. Исходный код поменял -- название одного из Main.mxml изменил на Main1.mxml.

AlexLucas 22.10.2012 17:47

А можете скинуть то что у вас пожалуйста ? Я не очень понимаю как вы объединили :)
И вы попробовали потестить мой код в изначальном виде? Тоже true выдало?

Добавлено через 2 часа 16 минут
Нет, правда, как вы объединили ?
Я засунул проект модуля в главный проект, закинул интерфейс в swc, swc положил в проект модуля, добавил этот swc и в тот и в другой проект, больше никаких ITest у меня нигде нет, запускаю, проверяю - всё равно false. Пожалуйста, скиньте свою версию.

dimarik 22.10.2012 21:12

Я положил два Main.mxml рядом, переименовав один из них. ITest.as стал общим. Ни строчки кода не менял. Без свиков.

"Версия" на работе осталась, вероятно, выложу.

AlexLucas 23.10.2012 12:54

Да, работает, спасибо.
Скажите, но ведь тут написано что по идее дочерний апп домен, при совпадении классов, должен наследовать родительские классы.
И что делать, если, к примеру, другой человек сделал свой модуль используя мой интерфейс, и просто прислал мне swf ?
И если у меня есть доступ к методам подгружаемого объекта, почему нельзя проверить если он может использовать мой интерфейс ? Почему имеет значение название интерфейса, пакет в котором он находится ? А в этом случае, это вообще должен быть 1 и тот же файл. Почему?

gloomyBrain 23.10.2012 14:23

Цитата:

Почему имеет значение название интерфейса, пакет в котором он находится ?
Хотя бы потому, что пакет - это часть имени класса или интерфейса. Имя файла - это краткое имя класса. Пакет (а значит и путь до) + краткое имя = полное имя класса/интерфейса. И для FlashPlayer'а имеет значение именно оно. Это как паспортные данные. Вас же не удивляет, что может быть 2 Василия, и при этом они разные люди. Или две Марии. Фактически у каждого из них есть уникальный идентификатор: ФИО + номер/серия паспорта. Так же и для классов/интерфейсов - есть краткое имя, есть полное. Интерфейсы или классы одинаковы, если их полные имена совпадают.

Цитата:

А в этом случае, это вообще должен быть 1 и тот же файл
Не должен. Так просто проще всего проверить, а вообще если вы сделаете 2 проекта и сохраните в них одинаковую структуру пакетов, то получите те же классы/интерфейсы (то есть при одинаковых сигнатурах методов, плеер будет считать их одинаковыми).

Цитата:

И что делать, если, к примеру, другой человек сделал свой модуль используя мой интерфейс, и просто прислал мне swf
Правильно выбрать ApplicationDomain для загрузки

AlexLucas 23.10.2012 14:37

Цитата:

Сообщение от gloomyBrain (Сообщение 1100967)
Хотя бы потому, что пакет - это часть имени класса или интерфейса. Имя файла - это краткое имя класса. Пакет (а значит и путь до) + краткое имя = полное имя класса/интерфейса. И для FlashPlayer'а имеет значение именно оно. Это как паспортные данные. Вас же не удивляет, что может быть 2 Василия, и при этом они разные люди. Или две Марии. Фактически у каждого из них есть уникальный идентификатор: ФИО + номер/серия паспорта. Так же и для классов/интерфейсов - есть краткое имя, есть полное. Интерфейсы или классы одинаковы, если их полные имена совпадают.

Вы правы, и я понимаю что это имеет значение, но я имел в виду именно данную ситуацию - может быть, скажем, Даша,она умеет петь() и рисовать(), и когда я проверяю (а у меня есть доступ к методам Даши) если Даша, которую я "загружаю" умеет петь() и рисовать(), мне возвращает false. И мне в принципе не важно с какого она города, и даже как её зовут, я смогу попросить её рассказатьОСебе() например :D

Цитата:

Сообщение от gloomyBrain (Сообщение 1100967)
Не должен. Так просто проще всего проверить, а вообще если вы сделаете 2 проекта и сохраните в них одинаковую структуру пакетов, то получите те же классы/интерфейсы (то есть при одинаковых сигнатурах методов, плеер будет считать их одинаковыми).


Правильно выбрать ApplicationDomain для загрузки

Посмотрите пожалуйста прикреплённые на предыдущей странице 2 проекта (1 архив), они с одинаковой структурой, вроде сделал как вы описали.

dimarik 23.10.2012 14:50

Там прикол в том, что у него оба ITest.as лежат в топ-левеле в разных проектах и идентичны до байта. А скастовать один к другому не получается.

AlexLucas 24.10.2012 13:40

Попробовал пошаманить, и заметил, что если основной проект загружает свфку модуля с папки в которой он был скомпилен, то получается кастовать к интерфейсу, а если передвинуть этот же свф в другую папку, то не получается :

Код:

|..
|module
|-bin
|--Module.swf
|-Module.mxml
|-ITest.as
|Module.swf
|Main.mxml
|ITest.as

Если Module.mxml имплементит module/ITest.as и изначально компилится и выдаёт module/bin/Module.swf, и Main.mxml подгружает module/bin/Module.swf, то подгружаемый обхект кастуется к ITest нормально (Main.mxml использует ITest что в корне), а если скомпилить тот же bin/Module.swf, и просто перенести его в корень к Main.mxml, то не кастуется.
А почему, не знаю.

dimarik 24.10.2012 22:01

Не очень понятно как module::ITest может скастоваться к ITest. Похоже, пора мне снова взять в руки шашки.


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

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