解决方案! 确保您没有错误地导入错误的类。
在我的例子中,我显式地导入了 TabButton,但是还有另一个 TabButton 类正在被导入,因为它与 TabButtonSubclass 存在于同一目录中。这是因为 TabButtonSubclass 存在于特定于一个应用程序的文件夹中。此文件夹还包含一个非常通用的类 TabButton,它与其他 TabButton 类完全无关且不兼容。特定于应用程序的 TabButton 类已重命名,因此很明显它属于该应用程序。
如果我写了 'public class MBTabButtonSprited extends [specific location] .TabButton',它会工作得很好。但似乎由于“扩展 TabButton”没有以特定路径开头,编译器默认为本地路径。
一段时间以来,我一直在我的桌子上敲打我的头,试图弄清楚这一点。
我的问题是我扩展了 Sprite 以创建一个 TabButton 类。然后我扩展了 TabButton 类(我们称之为 TabButtonSubclass)以获得一些额外的功能。当我尝试将 TabButtonSubclass 的实例强制转换为 TabButton 时,我得到 null。
奇怪的是,我可以将 TabButton或TabButtonSubclass 的实例转换为 Sprite,并且效果很好。
这是我的 TabButton 的样子:
import flash.display.Sprite;
public class TabButton extends Sprite {
public function TabButton():void {
super();
// code
}
}
这是我的 TabButtonSubclass 的样子:
import ...TabButton;
public class TabButtonSubclass extends TabButton {
public function TabButtonSubclass( bitmap:BitmapData ):void {
// code
super();
}
}
澄清 TabButtonSubclass 类:扩展 TabButton 的目的是让您可以使用提供的位图实例化 TabButtonSubclass。该位图将用于各种目的。我过去扩展了类并向构造函数添加了参数,并且效果很好。这不是一个好主意吗?
一些说明我的问题的示例代码:
import flash.display.Sprite;
import ...TabButton;
import ...TabButtonSubclass;
var btn1:TabButton = new TabButton();
trace( "btn1:", btn1 ); // btn1: [object TabButton]
trace( "btn1 as Sprite:", (btn1 as Sprite) ); // btn1 as Sprite: [object TabButton]
var btn2:TabButtonSubclass = new TabButtonSubclass( new GangTabMail() );
trace( "btn2:", (btn2) ); // btn2: [object TabButtonSubclass]
trace( "btn2 as TabButton:", (btn2 as TabButton) ); // btn2 as TabButton: null
trace( "btn2 as Sprite:", (btn2 as Sprite) ); // btn2 as Sprite: [object TabButtonSubclass]
如您所见,我可以毫无问题地将 btn1 转换为 Sprite。我也可以将 btn2 转换为 Sprite,它会返回预期的结果。但是,如果我尝试将 TabButtonSubclass 的实例转换为 TabButton,它会返回 null。
我有兴趣将 TabButtonSubclass 的实例转换为 TabButton,因为该应用程序使用了几个需要传递 TabButton 类型的对象的类。
下面是一些允许您将类键入为超类的代码示例:
import ...TabButton;
import flash.display.Sprite;
var myBtn:TabButton = new TabButton();
doStuff( myBtn ); // btn: [object TabButton]
function doStuff( btn:Sprite ):void {
trace( "btn:", btn );
}
如果您更深入一层,以下是代码失败的示例:
import ...TabButton;
import ...TabButtonSubclass;
import flash.display.Sprite;
var myBtn:TabButtonSubclass = new TabButtonSubclass( new BitmapData( ... ) );
doStuff( myBtn ); // Returns error: Implicit coercion of a value of type ...:TabButtonSubclass to an unrelated type ...:TabButton
doStuff( myBtn as TabButton ); // btn: null
function doStuff( btn:TabButton ):void {
trace( "btn:", btn );
}
当我尝试追踪它时,任何人都可以提供任何帮助来解释为什么我得到一个空响应吗?或者为什么我得到那个错误?我是否遗漏了有关子类和类型转换的内容?