Возвращать разные подклассы из функции? - PullRequest
0 голосов
/ 21 декабря 2009

Скажем, у меня есть четыре подкласса "Автомобиль". Один для каждого цвета. Я хочу иметь одну функцию, которая может создавать и возвращать подкласс '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;
    }

Ok. Ты понял. Это не работает по неизвестной мне причине. Я получаю 1118 ошибок, которые жалуются на конвертацию BlueCar в автомобиль и т. Д ...

Может кто-нибудь помочь мне здесь? Спасибо!

Ответы [ 4 ]

2 голосов
/ 22 декабря 2009

Сделать возвращаемую переменную супертипа:

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 голос
/ 21 декабря 2009

Вы должны попробовать привести ваш производный класс к базовому классу, прежде чем вернуть его обратно.

Не уверен насчет ActionScript, но в C ++ вы можете сделать это так

База * GetCarFromColor () { База * b1; b1 = новый D1; возврат b1; }

0 голосов
/ 23 декабря 2009

Причина, по которой вы получаете ошибки, состоит в том, что у вас есть две локальные переменные с одинаковыми именами разных типов в одной функции:

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

Переменная myCar указывается как BlueCar и RedCar. В ActionScript 3 переменные всегда ограничиваются всей функцией. В других языках, таких как Java, я знаю, что если операторы и циклы создают новую область видимости на уровне блоков, но здесь это не так.

Как предложил Мэтт Аллен, ввод myCar в качестве суперкласса Car должен остановить эти ошибки компилятора.

0 голосов
/ 21 декабря 2009

Может быть, вы должны использовать интерфейс вместо?

public interface ICar
{
}

public class BlueCar implements ICar
{
}

public function GetCarFromColor(_color:String):ICar
{
}
...