2010-06-16 70 views
0

我有兩個班,derivedClassAderivedClassB這兩者延長parentClass 我聲明瞭var o:parentClass然後根據這是怎麼回事,我想投oderivedClassA型或derivedClassB的任何福利。鑄造,AS3

從本質上講,這樣的:

var o:parentClass 

... 

if(shouldUseA) 
    o = new derivedClassA(); 
else 
    o = new derivedClassB(); 
o.doSomething(); 

但它不工作,我收到各種錯誤。這不是類繼承是如何工作的嗎?我覺得我錯過了一些非常重要的東西,但我無法弄清楚什麼。我應該使用接口嗎?還有另一種做我想做的事情的方式嗎?

編輯澄清:
- doSomething()parentClass定義爲public,並在派生類爲override public function doSomething()
- 我得到的錯誤是「通過靜態類型父類的引用調用可能未定義的方法DoSomething的「。和「將derviedClassA類型的值隱式強制爲無關類型父類」

+0

你會得到什麼錯誤?是在parentClass中定義的doSomething還是僅在子類中定義的? – luke 2010-06-16 20:59:13

+3

你的問題與你的例子不同。在你的問題中,你說你正在聲明'var o:classA'並試圖將它轉換爲'classB',這將無法工作。但是,您應該能夠執行示例所說的內容,即聲明'var o:parentClass',然後爲其分配一個其子類的值。 你想要做什麼,你會得到什麼樣的錯誤? 另外,正如上面所述:doSomething是在父類中定義的嗎?如果沒有,你需要預先施放(即:classA(o).doSomething();) – 2010-06-16 21:46:09

+3

而且,在標準方面你應該使用CapitalizedNamesForClasses。不應該影響你的結果,但只是爲了讓你知道這些名字是非常規的。 – 2010-06-16 21:47:57

回答

0

我將使接口能夠執行您所要求的操作。這你你不必投射變量,它會讓你訪問你的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方法。 希望它可以幫助... 摹運氣

+1

我不會推薦這個解決方案。任何類型爲接口的東西都將無法訪問父類的其他屬性。 – 2011-03-29 00:22:03

0

的具體回答您問的問題是這樣的:

o["doSomething"](); 

但是,我不建議你這麼做。我認爲真正的問題是你的父類應該定義doSomething(),那麼派生類應該覆蓋函數。

1

我以前做過這樣的事情:在基類中的虛函數中拋出錯誤,明顯地指出錯誤地調用它。當我做抽象基類時,我會這樣做。

Main.as(文檔類)

package 
{ 
    import flash.display.Sprite; 

    public class Main extends Sprite 
    { 
     private var superClassRef:SuperClass; 
     private var idLikeToBuyAnA:Boolean = true; 

     public function Main() 
     { 
      trace("Main()"); 
      if (idLikeToBuyAnA) 
      { 
       superClassRef = new DerivedClassA(); 
      } 
      else 
      { 
       superClassRef = new DerivedClassB(); 
      } 

      superClassRef.doSomething(); 
     } 
    } 
} 

SuperClass.as

package 
{ 
    public class SuperClass 
    { 
     public function SuperClass() 
     { 
     } 

     public function doSomething():void 
     { 
      throw new Error("Override me, I wish I were virtual!"); 
     } 
    } 
} 

DerivedClassA.as

package 
{ 
    public class DerivedClassA extends SuperClass 
    { 
     public function DerivedClassA() 
     { 
     } 

     override public function doSomething():void 
     { 
      trace("I'm and A!"); 
     } 
    } 
} 

DerivedClassB.as

package 
{ 
    public class DerivedClassB extends SuperClass 
    { 
     public function DerivedClassB() 
     { 
     } 

     override public function doSomething():void 
     { 
      trace("I'm a B!"); 
     } 
    } 
}