Реализация метода фабрики в ActionScript - PullRequest
0 голосов
/ 09 апреля 2011

Привет, ребята, у меня проблема с реализацией метода Factory. Ниже приведен фрагмент основного класса диаграммы, который вызывает метод ChartFactory для достижения нужного объекта. Я набираю Cast chartobject, чтобы иметь возможность вызывать метод Show, и я тоже опасаюсь этого.

        container = new VBox();
        container.percentWidth = 100;
        container.percentHeight = 100;
        super.media.addChild(container);

        chartObject = new ChartBase();
        chartObject = ChartFactory.CreateChartObject(chartType);
        IChart(chartObject).Show(o);
        container.addChild(chartObject);

        legend = new Legend();
        legend.dataProvider = IChart(chartObject);
        container.addChild(legend);

Ниже приведен фрагмент метода ChartFactory:

public static function CreateChartObject(subType:String):ChartBase
    {
         switch(subType)
         {
             case ChartFactory.AREA_CHART:
                 return new AreaCharts();
                 break;

             case ChartFactory.COLUMN_CHART:
                 return new ColumnCharts();
                 break;

             case ChartFactory.PIE_CHART:
                 return new PieCharts();
                 break;

             default:
                 throw new ArgumentError(subType + ": Chart type is not recognized.");
         }
    }

И следующий - метод Show одного из нескольких классов типов диаграмм: AreaCharts, PieCharts и т. Д. Все они реализуют интерфейс IChart.

public function Show(o:ObjectProxy):void
    {
        var grids:GridLines;
        var stroke:SolidColorStroke;
        var horizontalAxis:CategoryAxis;
        var verticalAxis:LinearAxis;
        var horizontalAxisRenderer:AxisRenderer;
        var verticalAxisRenderer:AxisRenderer;

        grids = new GridLines();

        if(WidgetStylesheet.instance.LineChart_ShowGrid)
            grids.setStyle("gridDirection", "both");
        else
            grids.setStyle("gridDirection", "");

        stroke = new SolidColorStroke(WidgetStylesheet.instance.LineChart_GridLineColor, WidgetStylesheet.instance.LineChart_GridLineThickness);
        grids.setStyle("horizontalStroke", stroke);
        grids.setStyle("verticalStroke", stroke);

        horizontalAxis = new CategoryAxis();
        horizontalAxis.categoryField = o.LargeUrl.Chart.xField;
        horizontalAxis.title = o.LargeUrl.Chart.xAxisTitle.toString();
        verticalAxis = new LinearAxis();
        verticalAxis.title = o.LargeUrl.Chart.yAxisTitle.toString();

        horizontalAxisRenderer = new AxisRenderer();
        horizontalAxisRenderer.axis = horizontalAxis;
        horizontalAxisRenderer.setStyle("tickLength", 0);
        horizontalAxisRenderer.setStyle("showLine", false);
        horizontalAxisRenderer.setStyle("showLabels", true);
        horizontalAxisRenderer.setStyle("fontSize", WidgetStylesheet.instance.ComputeChartAxisFontSize(o.HeadlineFontSize));
        verticalAxisRenderer = new AxisRenderer();
        verticalAxisRenderer.axis = verticalAxis;
        verticalAxisRenderer.setStyle("tickLength", 0);
        verticalAxisRenderer.setStyle("showLine", false);
        verticalAxisRenderer.setStyle("fontSize", WidgetStylesheet.instance.ComputeChartAxisFontSize(o.HeadlineFontSize));

        this.series = this.m_createSeries(o);
        this.horizontalAxis = horizontalAxis;
        this.horizontalAxisRenderers = [horizontalAxisRenderer];
        this.verticalAxis = verticalAxis;
        this.verticalAxisRenderers = [verticalAxisRenderer];
        this.backgroundElements = [grids];
    }

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

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

  1. Нет смысла создавать экземпляр ChartBase, если вы собираетесь изменить значение ссылки chartObject в следующей строке

    chartObject = new ChartBase();
    chartObject = ChartFactory.CreateChartObject(chartType);
    
  2. Если API ваших диаграмм равен IChart, ваша фабрика должна вернуть IChart вместо приведения.

    public static function CreateChartObject(subType:String):IChart
    
  3. Убедитесь, что вы возвращаете экземпляры правильного класса с завода. то есть вы возвращаете свой подкласс стандарта PieChart. Как правило, не стоит расширять класс, сохраняя то же имя и просто меняя пакет.

  4. Еще раз, если вы не уверены, входит ли программа в какую-либо функцию, используйте для этого отладчик Flash Builder. Я не могу представить разработку без отладчика.

0 голосов
/ 11 апреля 2011

Эй, чел. Я узнал, что WNT WRNG .. как и всегда это было "я". У меня есть привычка делать макеты, отделенные от основного проекта, и интегрировать их. Поэтому в макете я использовал xml, формат которого немного отличается от используемого в основном проекте. N i hd условный chk для возврата из программы, если определенное значение не совпадает, n из-за неисправного xml, которого я не сделал. Так что это скорее лексическая ошибка, чем логическая. Извините, спасибо Evryone за ответ.

0 голосов
/ 09 апреля 2011

Некоторые мысли:

  • Вы вызываете метод Show, передаете ему некоторый объект, но нигде в этом методе ни один дочерний элемент не добавляется в displayObject.Что именно должен делать Show?

  • многие переменные-члены в ваших классах начинаются с UpperCase.Компилятор может легко спутать их с именами классов, если ваши классы названы одинаково.Неправильный запуск имен переменных и функций с заглавными буквами.

  • Если преобразование экземпляра в другой класс или интерфейс завершится неудачно, вы получите ошибку времени выполнения.Их легко отладить с помощью отладчика Flash Builder.

...