2009-12-21 61 views
0

假設我有四個「汽車」子類。每種顏色一個。我想有一個函數可以根據傳入的值構建並返回一個'color-car'子類。這是一個愚蠢的例子,我知道,但這正是我想要做的只是規模較小。從函數返回不同的子類?

public class Car 
{ 
} 

public class BlueCar extends Car 
{ 
} 

你明白了。

然後,在另一個(helper)類中,我有一個函數,它接受一個顏色的字符串並返回正確的子類。

public function GetCarFromColor(_color:String):Car 
{ 
    if (_color == "blue") 
    { 
     var myCar:BlueCar = new BlueCar; 
     return myCar; 
    } else if (_color == "red") 
    { 
     var myCar:RedCar = new RedCar; 
     return myCar; 
    } 

好的。你懂了。這不適用於我未知的原因。我得到1118錯誤,抱怨BlueCar轉換成汽車等...

有人可以幫我在這裏嗎?謝謝!

+0

我不知道你可以在AS3中離開構造函數的括號。 – 2009-12-21 03:58:19

+0

你可以,它甚至可以節省幾個字節;) – grapefrukt 2009-12-21 21:07:03

回答

1

在返回之前,您應該嘗試將派生類轉換爲基類。

不確定動作,但在C++中,你可以做這樣的

基地* GetCarFromColor(){ 基地 * B1; b1 =新的D1; return b1; }

+0

不知道動作腳本,但隱式轉換沒有被執行似乎是編譯器開發人員的一點疏忽。 – Pierreten 2009-12-21 04:02:46

+0

好的。我該怎麼做? :) – 2009-12-21 04:07:56

+0

修改我的答案,告訴你如何在C++中做到這一點,可能是你沒有動作指針。 – 2009-12-21 04:14:20

0

也許你應該使用一個接口呢?

public interface ICar 
{ 
} 

public class BlueCar implements ICar 
{ 
} 

public function GetCarFromColor(_color:String):ICar 
{ 
} 
+0

我試過了,但它似乎沒有工作。我是否仍然需要按照上面的建議進行施放? – 2009-12-21 21:33:58

+0

如果您使用接口,我認爲您不需要轉換。但是你不應該需要帶有子類的強制轉換。 – 2009-12-21 21:54:25

2

使返回變量是父類型:

public function GetCarFromColor(_color:String):Car 
{ 
    var myCar:Car 
    if (_color == "blue") 
    { 
     myCar = new BlueCar; 
     return myCar; 
    } else if (_color == "red") 
    { 
     myCar = new RedCar; 
     return myCar; 
    } 

這個現在應該編譯OK。

0

你得到錯誤的原因是因爲你有不同類型的同名功能於一體兩個局部變量:

var myCar:BlueCar = new BlueCar; 
var myCar:RedCar = new RedCar; 

變量myCar的類型是既BlueCar和雷德卡。在ActionScript 3中,變量總是被作用於整個函數。在像Java這樣的其他語言中,我知道如果語句和循環創建一個新的塊級作用域,但這不是這種情況。

正如馬特艾倫建議的那樣,輸入myCar作爲超類Car應該停止這些編譯器錯誤。