Actionscript 3 AS3:内部类和接口的编译器错误?

Actionscript 3 AS3:内部类和接口的编译器错误?,actionscript-3,flash,air,flash-cs5,Actionscript 3,Flash,Air,Flash Cs5,出于一些不相关的原因,我需要一门课: 从MovieClip直接继承(或不继承)的 它实现了一个特定的接口(这里假设这个接口是空的,因为它没有改变任何问题) 以及其.as文件声明的内部类 以下代码总结了这一点: package { import flash.display.MovieClip; public class MyClass extends MovieClip implements EmptyInterface { } } class MyInnerClass { }

出于一些不相关的原因,我需要一门课:

  • MovieClip
    直接继承(或不继承)的
  • 它实现了一个特定的接口(这里假设这个接口是空的,因为它没有改变任何问题)
  • 以及其.as文件声明的内部类
  • 以下代码总结了这一点:

    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中测试了这一点。

    如果我没看错,您想要一个公共类来扩展一个内部类吗?-只要您将内部类声明为自己的打包文件,就没有任何东西可以阻止您这样做

    根据文件:

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


    如果是接口让您感到悲伤,您是否也在一个单独的文件中声明了它—您将导入该文件?正如注释中所回避的,名称空间的作用域非常重要,这样编译器就可以理解升级优先级是什么

    例如:

    以便:

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

    我说这是编译器的一个缺陷

    我已经测试并发现私有类必须扩展任何不是
    对象的类。除了扩展类,它还可以实现任何接口

    即使我将类放入更深的包中,这也同样有效


    我已经用Flash CS6测试过了

    如果这不能解决问题,我有另一个想法,但先试试这个。
    单击文件
    单击发布设置
    单击设置按钮
    取消选中自动声明阶段实例

    单击“确定”

    我猜想EmptyInterface正在阻止某些链接编译器正在测试的MovieCLips函数。内部类可能会导致问题,因为它在顶级包中的默认作用域是
    内部
    。你试过使用完全限定的包名吗?@阿斯曼不确定你说的是什么,但是,如果接口是问题的原因,那么当我删除内部类声明并保留接口时,为什么代码可以工作?@weltraumpirat我试过使用非顶级的包,但仍然出现错误(5000:类'src.MyClass'必须是'flash.display.MovieClip'的子类,因为它链接到该类型的库符号。)+1我也对它进行了测试,得出了相同的结论。内部类不是
    private
    ,但(事实上,类永远不能是
    private
    );省略visibility关键字默认为
    internal
    。这也是一件好事:该类因此可以移动到一个单独的文件中,而不会影响生成的二进制文件-这也适用于编译器,即使在不扩展
    Object
    时也是如此。我也对其进行了测试,它确实有效。只要内部类扩展(或实现)除
    Object
    之外的任何其他类编译器不会抱怨另一个类不是
    MovieClip
    的子类。这是编译器的错误。这不起作用。我试图更改其他AS选项,但这些更改都没有对问题产生影响。@antmarot请发布您的EmptyInterface类
    package {
        import flash.display.MovieClip;
        import my.example.EmptyInterface;
        public class MyClass extends MovieClip implements EmptyInterface { }
    }