我在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'错误。
答案 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
类型,但在运行时它可能是Sprite
或MovieClip
。