我將使接口能夠執行您所要求的操作。這你你不必投射變量,它會讓你訪問你的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