2009-12-21 63 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应该停止这些编译器错误。