【问题标题】:AS3: Compiler bug with inner classes and interfaces?AS3:内部类和接口的编译器错误?
【发布时间】:2012-07-16 13:31:13
【问题描述】:

由于一些不相关的原因,我需要一个类:

  1. MovieClip 继承(直接或不继承)。
  2. 实现了一个特定的接口(假设这个接口是空的,因为它不会改变任何问题)。
  3. 并且其 .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 中对此进行了测试。

【问题讨论】:

  • 我的猜测是 EmptyInterface 会阻塞一些 MovieCLips 函数,当链接时编译器正在测试这些函数。
  • 内部类可能会导致问题,因为它在顶级包中的默认范围为internal。您是否尝试过使用完全限定的包名?
  • @The_asMan 不太明白你说的是什么,但是如果接口是问题的原因,为什么当我删除内部类声明并保留接口时代码工作?
  • @weltraumpirat 我确实尝试使用不是顶级的包并且仍然引发错误(5000:类'src.MyClass'必须子类'flash.display.MovieClip',因为它是链接的到该类型的库符号。)

标签: actionscript-3 flash air flash-cs5


【解决方案1】:

我说这是编译器的错误。

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

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

我已经用 Flash CS6 对此进行了测试。

【讨论】:

  • +1 我也对其进行了测试并得出了相同的结论。内部类不是private,虽然(事实上,类永远可以是private);省略可见性关键字默认为internal。也有好处:因此可以将类移动到单独的文件而不影响生成的二进制文件 - 这也适用于编译器,即使不扩展 Object
  • 我也测试过它确实有效。只要内部类扩展(或实现)除Object 之外的任何其他内容,编译器就不会抱怨 other 类不是MovieClip 的子类。它是编译器错误。
【解决方案2】:

如果我没看错的话,你想要一个公共类来扩展一个内部类吗? - 没有什么可以阻止你这样做,只要你声明你的 internal class 作为它自己的打包文件。

根据文档:

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



如果是让您感到悲伤的界面,您是否也在单独的文件中声明了它 - 您会导入吗?正如 cmets 中所避免的,命名空间范围很重要,以便编译器了解升级优先级是什么。

例如:

package my.example {
   public interface EmptyInterface
   {
   }
}

这样:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 那行不通。我也尝试更改其他 AS 选项,但这些更改均未对问题产生影响。
    • @antmarot 请发布您的 EmptyInterface 课程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多