Передача строго типизированного объекта в метод, ожидающий интерфейс - PullRequest
3 голосов
/ 26 июля 2011

У меня возникают трудности при передаче строго типизированного объекта AttractView другому методу addView(), который ожидает интерфейс IWizardView, который AttractView реализует.

Когда я передаю его как есть (как показано ниже), я получаю ошибку компиляции CaptureApplication.as, Line 120 1067: Implicit coercion of a value of type AttractView to an unrelated type IWizardView.

Приведение к IWizardView или BaseView перед передачей приводит к аналогичной ошибке во время выполнения.

Класс применения:

public class CaptureApplication extends MovieClip
{
    public var attractView : AttractView;
    public var captureView : CaptureView;
    public var reviewView : ReviewView;
    public var completeView : CompleteView;
    protected var wizard : Wizard;

    public function CaptureApplication()
    {
        // Create views
        attractView = new AttractView();
        captureView = new CaptureView();
        reviewView = new ReviewView();
        completeView = new CompleteView();

        // Create wizard and add views to sequence
        wizard = new Wizard( this );
        wizard.addView( attractView );
        wizard.addView( captureView );
        wizard.addView( reviewView );
        wizard.addView( completeView );
    }

    // ...
}

Мастер:

public class Wizard extends EventDispatcher
{
    // ...

    public function addView ( pView : IWizardView ) : void
    {
        // ...
    }

    //...
}

И пример просмотра:

public class AttractView extends BaseView implements IWizardView
{
    // ...
}

Архитектура, на которую я надеюсь (упрощено для ясности):

CAPTURE LIBRARY (AS3 SWC)
/ classes
    / wizard
        / IWizardView
        / Wizard
    / capture
        / IView
        / BaseView
        / AttractView
        / CaptureView
        / (etc.)

CAPTURE APPLICATION (Flash)
/ classes
    / CaptureApplication

Идея заключается в том, что я создаю несколько приложений «захвата» с одинаковыми пользовательскими интерфейсами, поэтому я хотел бы извлечь общие элементы в библиотеку и расширить их по мере необходимости для каждого уникального приложения захвата.

Обновление 1:

IWizardView и Wizard фактически живут в отдельной библиотеке SWC, которая включена в проект CaptureApplication. Также стоит отметить, что FLA и проекта FB включают SWC. Возможно, есть конфликт? Как только я переместил все классы из библиотеки в проект и удалил SWC из проекта и FLA, все заработало.

У меня будет еще время поиграть и исследовать завтра. Обновление, чтобы следовать.

Обновление 2:

Я нашел, где моя архитектура ломается. Я могу нормально хранить свои интерфейсы и класс BaseView в моей библиотеке SWC. Проблема возникает, как только я пытаюсь переместить мои представления (AttractView и т. Д.) Из проекта приложения в библиотеку SWC. Моя папка libs объединена в код, а не в режиме реального времени. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Единственный способ, которым я знаю, что это может не сработать, это когда вы загружаете некоторые части вашего приложения в разные домены приложений или если используемые вами домены приложений находятся в разных доменах безопасности (в этом случае домены приложений будут отличаться независимо от что бы вы ни делали).

Это может произойти, если домен приложения, содержащий IWizardView в Wizard, отличается от домена приложения, в котором находится AttractView. Это происходит только при загрузке частей приложения (и может быть также при встраивании с помощью [Embed] - не совсем точно).

Если это так, вы можете даже иметь полностью идентичные имена классов и интерфейсов, но все равно получать ошибки приведения. Примечание. В Flash Builder вы можете видеть адреса объявлений деклараций, которые можно сравнивать (особенно в сообщениях об исключениях).

См. Следующие части документации:

Если это не так, и вы ничего не загружаете, пожалуйста, уточните свой вопрос немного. Мне действительно любопытно, в чем проблема.

РЕДАКТИРОВАТЬ Статьи о доменах приложений для кода в SWC, используемого в качестве RSL.

1 голос
/ 26 июля 2011

Попробуйте набрать AttractView как IWizardView в своем общедоступном члене:

public var attractView : IWizardView;

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

чем больше я думаю об этом, тем больше я думаю, что столкнулся с этой проблемой раньше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...