我将使接口能够执行您所要求的操作。这你你不必投射变量,它会让你访问你的doSomething函数。 这是一个使用你的结构的小例子: 请注意,所有的类都在同一个根包中,因此没有导入语句。
MainApp.as(这是默认的应用程序)
package
{
import flash.display.Sprite;
public class MainApp extends Sprite
{
private var parentClass : IParent;
private var doA : Boolean = false;
public function MainApp()
{
if (doA)
parentClass = new DerivedClassA();
else
parentClass = new DerivedClassB();
parentClass.doSomething();
}
}
}
Parent.as
package
{
import flash.display.Sprite;
public class Parent extends Sprite
{
public function Parent()
{
}
}
}
DerivedClassA.as
package
{
public class DerivedClassA extends Parent implements IParent
{
public function DerivedClassA()
{
super();
}
public function doSomething() : void
{
trace (this + " done something");
}
}
}
个DerivedClassB.as
package
{
public class DerivedClassB extends Parent implements IParent
{
public function DerivedClassB()
{
super();
}
public function doSomething() : void
{
trace (this + " done something");
}
}
}
IParent.as
package
{
public interface IParent
{
function doSomething():void;
}
}
正如你可以看到使用界面,调用该函数DoSomething的无铸造。 关于转换变量没有问题,但是这可以为您提供更加结构化的代码,并且可以确保您在实现该接口的类中具有doSomething方法。 希望它可以帮助... 摹运气
你会得到什么错误?是在parentClass中定义的doSomething还是仅在子类中定义的? – luke 2010-06-16 20:59:13
你的问题与你的例子不同。在你的问题中,你说你正在声明'var o:classA'并试图将它转换为'classB',这将无法工作。但是,您应该能够执行示例所说的内容,即声明'var o:parentClass',然后为其分配一个其子类的值。 你想要做什么,你会得到什么样的错误? 另外,正如上面所述:doSomething是在父类中定义的吗?如果没有,你需要预先施放(即:classA(o).doSomething();) – 2010-06-16 21:46:09
而且,在标准方面你应该使用CapitalizedNamesForClasses。不应该影响你的结果,但只是为了让你知道这些名字是非常规的。 – 2010-06-16 21:47:57