2011-04-09 72 views
0

嘿伙计们,我有这个问题实现了Factory方法。 以下是调用ChartFactory的方法来获取正确对象的主Chart类的片段。我键入Cast Chart对象以便能够调用Show方法;我也担心这一点。工厂方法在actionscript中的实现

 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."); 
     } 
    } 

而以下是几个图表类型的类之一的显示方法:AreaCharts,等扇形图的所有都实现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]; 
    } 
+0

那么你想问什么问题?抛弃某人去寻找问题有点太多了。 – frankhermes 2011-04-09 07:11:44

+0

图表没有显示..对象正确实例化,但我担心Show方法被调用和类型转换。 – 2011-04-09 07:26:39

+0

这应该做什么? chartObject = new ChartBase(); chartObject = ChartFactory.CreateChartObject(chartType); – hooleyhoop 2011-04-09 08:39:13

回答

0

嘿脂肪酶.. 我发现笏Wnt信号wrng..as olwys它WA “我”。 我有一种习惯,将主项目隐藏起来,并将其整合。因此,在模拟中,我使用了一种xml格式,它与主项目中的格式略有不同。 如果某个值不匹配,则我有条件的chk从prog返回,n由于错误的xml我没有。 所以这更多的是一个词汇错误而不是逻辑错误。 对不起n Thanx evryone作出回应。

1

恐怕这个代码有多个问题。不幸的是,为什么你的图表不显示,所以你可能会应用下面的一些建议,并使用调试器来分析问题。

  1. 有创造ChartBase例如,如果你要改变下一行

    chartObject = new ChartBase(); 
    chartObject = ChartFactory.CreateChartObject(chartType); 
    
  2. 如果你的图表的API是chartObject参考值是没有意义的IChart你的工厂应该返回IChart而不是铸造。

    public static function CreateChartObject(subType:String):IChart 
    
  3. 请确保您正在从工厂返回正确类的实例。即您要返回标准PieChart的子类。通常,延长课程名称并改变包装并不是最好的办法。

  4. 再一次,如果您不确定程序是否进入某个函数,请使用Flash Builder调试器来检查该问题。我无法想象没有调试器的开发。

+0

Thanx的答案班纳斯,但我试图杜林老东西你建议..它绝对要做的工作..! – 2011-04-09 13:39:10

+0

你是什么意思,“它不工作”?调试器在Flash Builder中正常工作。我建议你在从工厂获得对象之前设置一个断点,然后逐步验证所有值是否应该是。以下是关于调试器工作原理的资源:http://help.adobe.com/en_US/flashbuilder/using/WS6f97d7caa66ef6eb1e63e3d11b6c4d0d21-7f07.html – Tjofras 2011-04-09 17:25:22

+0

Thanx for the response dude .. “它不起作用”意味着smthng smwr是不要阻止输出。 thanx为链接..我usd d debggr没有我gt没有..thts笏md我打电话给hlp! – 2011-04-11 10:38:56

0

的几点思考:

  • 调用Show方法,通过它的一些对象,但无处在的方法是任意的孩子加入到一个显示对象。 Show应该做什么?

  • 您的类中的很多成员变量都以UpperCase开头。如果您的类命名相同,编译器可以很容易地将这些类与名称混淆。不好的做法是用大写字母来启动变量和函数名称。

  • 如果将一个实例转换为另一个类或接口失败,将会出现运行时错误。这些使用Flash Builder调试器很容易调试。

+0

frankhermesthanx回应...程序已经正常工作。 我通过callin show method..dn绘制对象中的东西,我直接将对象(chartObject)添加到容器中。 N类型铸造也是fyn .. – 2011-04-11 10:35:23