2012-07-16 100 views
2

对于一些无关紧要的原因,我需要一个类:AS3:内部类和接口的编译器错误?

  1. 继承(直接与否)从MovieClip
  2. 它实现了一个特定的接口(让我们假设这个接口是空的,因为它不会改变任何问题)。
  3. 及其。作为文件声明内部类。

下面的代码求和这件事:

package { 
    import flash.display.MovieClip; 
    public class MyClass extends MovieClip implements EmptyInterface { } 
} 

class MyInnerClass { } 

上面代码的问题是,它不会总是编译。只要我使用MyClass作为链接对于我的库项目之一,编译器抱怨MyClass不是MovieClip的子类。另一方面,如果我手动实例化并将其添加到舞台,一切都会很好。

看起来接口和内部类在某种特定情况下以某种方式相互排斥。事实上,如果我删除了内部类我没有这样的错误了:

package { 
    import flash.display.MovieClip; 
    public class MyClass extends MovieClip implements EmptyInterface { } 
} 

同样的事情时我删除实现的接口,但保持内部类:

package { 
    import flash.display.MovieClip; 
    public class MyClass extends MovieClip { } 
} 

class MyInnerClass { } 

请注意,我只是完成在Flash CS5中对此进行了测试。

+0

我的猜测是,EmptyInterface阻止一些影片剪辑功能的该链接时,编译器测试对于。 – 2012-07-16 14:23:29

+0

内部类可能会导致问题,因为它在默认范围内,而在顶层包中。您是否尝试过使用完全限定的软件包名称? – weltraumpirat 2012-07-16 16:10:12

+0

@The_ManMan不知道你说了什么,但是,如果接口是问题的原因,当我删除内部类声明并保留接口时,代码为什么工作? – 2012-07-17 07:29:51

回答

1

我说这是编译器的一个bug。

我测试过并发现私人课程必须扩展任何不是Object的课程。它可以实现任何接口,而不是扩展类。

即使我把类放到更深的包中,这也是一样的。

我已经用Flash CS6测试过了。

+0

+1我也测试过它并得出了相同的结论。虽然内部类不是“私人”,但实际上,类可以永远不会是私有的。省略可见性关键字默认为'internal'。好东西:因此,类可以移动到一个单独的文件,而不会影响生成的二进制文件 - 即使不扩展Object也适用于编译器。 – weltraumpirat 2012-07-17 15:41:27

+0

我也测试过它,它确实有效。只要内部类扩展(或实现)除“Object”以外的其他任何内容,编译器就不会抱怨** other类不是“MovieClip”的子类。编译器错误是。 – 2012-07-18 07:59:07

0

如果我正在读你的话,你想要一个公开课来扩展一个内部课程吗? - 只要你声明自己的内部类为自己的打包文件,就没有任何东西阻止你这样做。

根据文档:

[dynamic] [public | internal] [final] class className [ extends superClass ] [ implements interfaceName[, interfaceName... ] ] { 
    // class definition here 
} 



如果它是给你悲伤的界面,你在一个单独的文件中声明的一样好 - 你会导入?正如评论中所隐含的那样,命名空间范围的确定非常重要,这样编译器就可以理解升级的优先级是什么。

如:

package my.example { 
    public interface EmptyInterface 
    { 
    } 
} 

这样:

package { 
    import flash.display.MovieClip; 
    import my.example.EmptyInterface; 
    public class MyClass extends MovieClip implements EmptyInterface { } 
} 
0

如果这不能解决它我有另一个想法,但首先尝试。
点击文件
点击发布上的设置按钮设置
点击
取消选中自动声明舞台实例
单击确定

+0

这不起作用。我试图改变其他AS选项,但这些改变都没有影响到这个问题。 – 2012-07-18 07:51:02

+0

@antmarot请发布您的EmptyInterface类 – 2012-07-18 12:59:37