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
直接继承(或不继承)的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 { }
}