假设我有四个'Car'子类。每种颜色一个。我希望有一个函数可以根据传递的值构建并返回一个'color-car'子类。我知道,这是一个愚蠢的例子,但正是我试图做的只是规模较小。
public class Car
{
}
public class BlueCar extends Car
{
}
你明白了。
然后,在另一个(帮助器)类中,我有一个函数,它接收一个颜色的字符串并返回正确的子类。
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转换为Car等等......
有人可以帮助我吗?谢谢!
答案 0 :(得分: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;
}
现在应该编译好了。
答案 1 :(得分:1)
您应该尝试将派生类转换为基类,然后再将其返回。
不确定动作脚本,但在C ++中你可以这样做
Base * GetCarFromColor() { 基数* b1; b1 =新D1; 返回b1; }
答案 2 :(得分:0)
也许您应该使用界面?
public interface ICar
{
}
public class BlueCar implements ICar
{
}
public function GetCarFromColor(_color:String):ICar
{
}
答案 3 :(得分:0)
您遇到错误的原因是因为您在一个函数中有两个同名且具有不同类型的局部变量:
var myCar:BlueCar = new BlueCar;
var myCar:RedCar = new RedCar;
变量myCar
被输入为BlueCar和RedCar。在ActionScript 3中,变量始终作用于整个函数。在其他语言中,比如Java,我知道如果语句和循环创建了一个新的块级范围,但在这里并非如此。
正如Matt Allen建议的那样,输入myCar
作为超类Car
,应该可以阻止这些编译错误。