1

解决方案! 确保您没有错误地导入错误的类。

在我的例子中,我显式地导入了 TabButton,但是还有另一个 TabButton 类正在被导入,因为它与 TabButtonSubclass 存在于同一目录中。这是因为 TabButtonSubclass 存在于特定于一个应用程序的文件夹中。此文件夹还包含一个非常通用的类 TabButton,它与其他 TabButton 类完全无关且不兼容。特定于应用程序的 TabButton 类已重命名,因此很明显它属于该应用程序。

如果我写了 'public class MBTabButtonSprited extends [specific location] .TabButton',它会工作得很好。但似乎由于“扩展 TabButton”没有以特定路径开头,编译器默认为本地路径。

一段时间以来,我一直在我的桌子上敲打我的头,试图弄清楚这一点。

我的问题是我扩展了 Sprite 以创建一个 TabButton 类。然后我扩展了 TabButton 类(我们称之为 TabButtonSubclass)以获得一些额外的功能。当我尝试将 TabButtonSubclass 的实例强制转换为 TabButton 时,我得到 null。

奇怪的是,我可以将 TabButtonTabButtonSubclass 的实例转换为 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 );
}

当我尝试追踪它时,任何人都可以提供任何帮助来解释为什么我得到一个空响应吗?或者为什么我得到那个错误?我是否遗漏了有关子类和类型转换的内容?

4

4 回答 4

1

I'm not sure why it would return null, but the way I would handle it would be to rather define the variable using the base class and cast up when needed, eg.

import ...TabButton;
import ...TabButtonSubclass;
import flash.display.Sprite;

var myBtn:TabButton = new TabButtonSubclass( new BitmapData( ... ) );
doStuff( myBtn ); // No need to case here since myBtn is already defined as TabButton

function doStuff( btn:TabButton ):void {
    trace( "btn:", btn );
}

Then if you need TabButtonSubclass functionality you cast it up:

var myBtnSub:TabButtonSubclass = myBtn as TabButtonSubclass;
于 2013-07-10T18:57:05.567 回答
0

您的代码应该可以完美运行。但是,当您将函数参数的类型声明为类时,这不是其他人所说的“最佳实践”。你应该有你的 TabButton 的接口

您可以将大量不同的对象传递给您的函数,但有一个例外:对象必须具有您的接口所具有的所有方法。而已。见多态性


您的问题的一种可能答案是:

public class TabButtonSubclass extends TabButton {

上面的TabButton和下面的 TabButton 是不同的

trace( "btn2 as TabButton:", (btn2 as TabButton) ); // btn2 as TabButton: null

强制转换和as运算符之间的一个关键区别是失败时的行为。当强制转换失败时,会抛出 TypeError。使用as运算符,只要转换失败,就会返回数据类型的默认值。阅读更多...

于 2013-07-10T19:58:30.347 回答
0

我不是 AS3 方面的专家并且仍在学习,但也许这会有所帮助:

在您的最后一个代码段中,当您这样做时

doStuff( myBtn );

doStuff( myBtn as TabButton);

你在那里做的是TabButtonSubclass当函数需要一个类型为TabButton. 所以这就是为什么你会得到关于隐式强制的第一个错误。

cast现在,如果您尝试将变量传递给函数时会得到 null 的原因TabButton,我不太确定,但我认为如果 acast不能被“尊重”(即,您告诉编译器转换是有效的,但事实证明它实际上不是,例如,如果您尝试将 XML 数据转换为影片剪辑),那么结果将为空。

希望有帮助,但我可能完全错了!

于 2013-07-10T17:17:45.747 回答
0

确保您没有错误地导入错误的类。

在我的例子中,我显式地导入了 TabButton,但是还有另一个 TabButton 类正在被导入,因为它与 TabButtonSubclass 存在于同一目录中。这是因为 TabButtonSubclass 存在于特定于一个应用程序的文件夹中。此文件夹还包含一个非常通用的类 TabButton,它与其他 TabButton 类完全无关且不兼容。特定于应用程序的 TabButton 类已重命名,因此很明显它属于该应用程序。

如果我写了'公共类 MBTabButtonSprited 扩展[特定位置]。TabButton',它会工作得很好。但似乎由于“扩展 TabButton”没有以特定路径开头,编译器默认为本地路径。

于 2013-07-11T14:43:25.177 回答