在Actionscript中作为子类进行转换

时间:2009-07-01 05:24:46

标签: inheritance actionscript oop casting

我在ActionScript中有以下类:

public class A {
}

public class B extends A {
}

和这些变量(在另一个类中):

public var InstanceOfA:A;
public var InstanceOfB:B;

如何将A的实例转换为B类?

我试过了:

InstanceOfA = new A();
InstanceOfB = InstanceOfA as B; 
trace(InstanceOfB);

我为InstanceOfB获得了A类型的对象。

我也尝试过:

instanceOfB = B(InstanceOfA);

在这种情况下,我收到'Type Coercion Failed'错误。

2 个答案:

答案 0 :(得分:7)

使用强制转换,您只能从更多特定的角色进行投射。由于B扩展了A,理论上它将包含A类不包含的更具体的代码。因此,可以将B转换为A(因为B是A),但是你不能将A转换为B,因为A不是B。

以可能更合乎逻辑的方式表达它,比如说A类是“动物”而B类是“狗”。 Dog是Animal的更具体的实现。

狗是一种动物,所以你可以把狗当作动物,但是你不能把动物当作狗来施展,因为不是每只动物都是狗。

希望这是有道理的。

现在,如果您想要执行上述操作,可以让A和B都扩展Abstract基类,或者实现一个接口并将两个实例变量键入为抽象类或接口。

答案 1 :(得分:3)

Alex Jillard回答的补充:如果A中的值已经是B类型,则可以将instanceofA类型的变量转换为B类型。< / p>

所以,如果你有

var instanceOfA:A = new B();

然后这将有效:

instanceOfB = instanceOfA as B;

处理事件时会出现这种情况。 currentTarget上的MouseEvent属性被声明为Object类型,但在运行时它可能是SpriteMovieClip