将强类型对象传递给期望接口的方法

时间:2011-07-26 19:46:30

标签: flash flex actionscript-3

我很难将强类型对象AttractView传递给另一个方法addView(),该方法期望IWizardView实现AttractView接口。

当我按原样传递它时(如下所示),我得到编译错误CaptureApplication.as, Line 120 1067: Implicit coercion of a value of type AttractView to an unrelated type IWizardView.

在传递之前投射到IWizardViewBaseView会在运行时产生类似的错误。

申请类:

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

这里的想法是我正在构建具有类似UI的多个“捕获”应用程序,因此我想将常见元素提取到库中,并根据需要为每个独特的捕获应​​用程序进行扩展。

更新1:

IWizardViewWizard实际上位于CaptureApplication项目中包含的单独的库SWC中​​。同样值得注意的是,FLA FB项目都包括SWC。也许有冲突?一旦我将所有类从库移动到项目并从项目和FLA中删除了SWC,它就能工作。

明天我将有更多时间参加比赛并进行调查。更新以遵循。

更新2:

我发现我的架构正在破碎。我可以将我的接口和BaseView类保存在我的库SWC中​​就好了。一旦我尝试将我的应用程序项目中的视图(AttractView等)移动到库SWC中​​,就会出现问题。我的libs文件夹合并到代码中,而不是实时共享。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我知道这一点的唯一方法可能不起作用是当您将应用程序的某些部分加载到不同的应用程序域中时,或者如果您使用的应用程序域位于不同的安全域中(在任何情况下,应用程序域都会有所不同,无论不管你做什么。)

IWizardView中包含Wizard的aplpication域与AttractView所在的应用程序域不同时,可能会发生这种情况。只有在加载应用程序部件时才会发生这种情况(也可能在使用[嵌入]嵌入时也是如此 - 不确定。)

如果是这种情况,您甚至可能拥有完全相同的限定类和接口名称,但仍会出现强制错误。注意:在Flash Builder中,您可以看到可以比较的声明的内存地址(特别是在异常消息中)。

请参阅文档的以下部分:

如果情况并非如此,并且您未在任何地方加载任何内容,请稍微详细说明您的问题。我真的很好奇是什么问题。

编辑有关用作RSL的SWC代码的应用程序域的文章。

答案 1 :(得分:1)

尝试在公共成员中键入AttractView作为IWizardView

public var attractView : IWizardView;

我认为如果您希望将其识别为界面,则必须将其键入为一个界面。如果您的设计得到正确实施,那对您来说应该不是问题,因为这有点像接口。

我想的越多,我认为我越是遇到这个问题