2011-07-26 70 views
3

我遇到了难以将强类型对象AttractView传递到另一个方法addView(),该方法需要AttractView实现的IWizardView接口。将强类型对象传递给期望接口的方法

当我将它作为-是(如下所示),我得到的编译错误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 

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

更新1:

IWizardViewWizard实际生活中所包含的CaptureApplication项目一个单独的库SWC。还值得注意的是,FB项目的FLA 都包括SWC。也许有冲突?只要我将所有课程从图书馆搬到项目中,并将SWC从项目和FLA中移除,它就可以工作。

明天我将有更多的时间玩和调查。请按照更新。

更新2:

我发现在我的体系结构断裂。我可以在我的图书馆SWC中保留我的接口和BaseView类。只要我尝试将我的应用程序项目的视图(AttractView等)移动到库SWC中​​,就会出现问题。我的libs文件夹被合并到代码中,而不是实时共享。有任何想法吗?

+0

奇怪,应该工作。 –

+0

这就是我的想法! – marcelebrate

+0

是的。应该肯定会工作。 ...嗯 – Bosworth99

回答

1

试着键入AttractView在你的公共成员的IWizardView

public var attractView : IWizardView; 

我想,如果你希望它是公认的,因为它必须输入为一个接口。如果你的设计正确实现,那对你来说不应该是一个问题,因为这只是一个界面。

我想它的越多,我越觉得我遇到了这个问题之前

+0

我尝试过不同的化身。问题是我无法在我的'CaptureApplication'类中创建我的视图实例,如我的示例所示。我正在使用一个接口,以便我的'Wizard'类可以通过像next(),previous()等方法与视图进行交互。 – marcelebrate

+0

当然,改变它会改变你的应用程序作品,但它可能是更好的。 –

+0

我也尝试在我的作业中投射:'attractView = IWizardView(new AttractView())'。运行时产生相同的转换错误。使用'as'只是使'pView'为空。它按照预期在'CaptureApplication'中追踪。 – marcelebrate

2

我知道的唯一途径,这可能无法正常工作是当加载应用程序的某些部分成不同的应用领域或者您正在使用的应用程序域驻留在不同的安全域中(在任何情况下,无论您做什么,这些应用程序域都会有所不同)。

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

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

参考文档的这些部分:

如果不是这种情况,你是不是在任何地方装东西,请详细说明你的问题。我真的好奇这有什么问题。

编辑关于用作RSL的SWC中的代码的应用领域的文章。

+0

我认为这是它的要点。我在问题评论中提到,“IWizardView”和“Wizard”实际上位于我加载到包含特定视图(“AttractView”,“CaptureView”等)的FB项目中的共享库SWC中​​。只要我将库项目中的类移动到应用程序项目中,它就可以工作。对我来说,在编译时我无法做到这一点似乎有点奇怪。运行时间,我明白。我将在明天做一个小小的游戏,以确定究竟是什么让它失败,并希望如何在保持我的图书馆外部的情况下解决它。 – marcelebrate

+0

如果您将SWC用作实时共享库(未合并到代码中),则可能需要查看这些文章:[在help.adobe.com上指定RSL的域](http://help.adobe.com/ en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf674ba-7fff.html#WS19f279b149e7481c-64f4fc4712daa436650-7fff),[Same Domain:senocular.com上的运行时共享库​​](http://www.senocular.com/flash/tutorials/contentdomains/?page = 2#SameDomainRuntimeSharedLibraries) –

+0

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