从自定义类中获取数据(OOP问题)

时间:2010-10-27 08:06:00

标签: actionscript-3 oop

如何从自定义类中获取一些var / data?

XML类

package classes
{
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.display.MovieClip;

    public class videoData extends MovieClip
    {   
       private var myXML:XML;
       private var myXMList:XMLList;

       public function videoData()
       {
          var myXMLLoader:URLLoader = new URLLoader();
          myXMLLoader.load(new URLRequest("playlist.xml"));
          myXMLLoader.addEventListener(Event.COMPLETE, processXML);
       }

       private function processXML(e:Event):void
       {
          myXML = new XML(e.target.data);
          myXMList = new XMLList(myXML.children());
       }

       public function getXML()
       {
          return myXML;
       }
    }
}

调用XML的类

package classes
{
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import classes.videoData;

    public class playList extends MovieClip
    {
       private var vData:videoData = new videoData();

       public function playList()
       {
          trace(vData.getXML())
       }
    }
}

3 个答案:

答案 0 :(得分:1)

我会在'playList'中设置一个事件监听器,并在XML加载完成后从'videoData'调度一个Event。这样你就知道它什么时候没有使用ENTER_FRAME完成加载(它将使用更多的CPU作为每帧的检查)。

package classes
{
    import flash.events.*;
    import flash.display.MovieClip;
    import classes.VideoData;

    public class PlayList extends MovieClip
    {
       private var vData:VideoData;

       public function PlayList()
       {
           vData = new VideoData();
           vData.addEventListener(Event.COMPLETE, onXMLCompleteHandler);
       }

       private function onXMLCompleteHandler(e:Event):void
       {
           vData.removeEventListener(Event.COMPLETE, onXMLCompleteHandler);
           trace(vData.getXML());
       }
    }
}

package classes
{
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.display.MovieClip;

    public class VideoData extends MovieClip
    {   
       private var myXML:XML;
       private var myXMList:XMLList;
       private var myXMLLoader:URLLoader;

       public function VideoData()
       {
          myXMLLoader = new URLLoader();
          myXMLLoader.load(new URLRequest("playlist.xml"));
          myXMLLoader.addEventListener(Event.COMPLETE, processXML);
       }

       private function processXML(e:Event):void
       {
           myXMLLoader.removeEventListener(Event.COMPLETE, processXML);
           myXML = new XML(e.target.data);
           myXMList = new XMLList(myXML.children());
           dispatchEvent(e);
       }

       public function getXML():XML
       {
           return myXML;
       }
    }
}

您还应该始终将您的班级名称'VideoData'大写,而不是'videoData'

答案 1 :(得分:0)

您已通过myXML方法获取私有.getXML()变量。这是将封装数据公开给外部类的最佳方法。

另一种方法是使您的myXML字段public代替private,但使用get / set访问器方法,您将隐藏外部世界的实际实现。

[编辑]

如果您的getXML()方法返回null,则表示尚未调用您的事件处理程序(processXML方法)。

问题似乎出现在您的VideoData构造函数中:

   public function videoData()
   {
      var myXMLLoader:URLLoader = new URLLoader();
      myXMLLoader.load(new URLRequest("playlist.xml"));
      myXMLLoader.addEventListener(Event.COMPLETE, processXML);
   }

在附加事件处理程序之前,可能已加载 XML文件,这就是事件在您开始侦听之前触发的原因。尝试颠倒它,看它是否有效:

   public function videoData()
   {
      var myXMLLoader:URLLoader = new URLLoader();
      myXMLLoader.addEventListener(Event.COMPLETE, processXML); // moved up
      myXMLLoader.load(new URLRequest("playlist.xml"));
   }

答案 2 :(得分:0)

在获取值之前,您需要接收XML数据。 在videoData类中添加一个私有布尔_xmlLoaded,在processXML方法中将其设置为true。

创建一个getter

public function get xmlLoaded():Boolean
{
   return _xmlLoaded;
}

现在你可以这样做:

private var data:videoData = new videoData();
private var xmlData:XML;

private function init():void
{
   addEventListener(Event.ENTER_FRAME , xmlLoaded );
}

private function xmlLoaded(event:Event):void
{
   if( videoData.xmlLoaded )
   {
     xmlData = videoData.getXML();
     removeEventListener(Event.ENTER_FRAME , xmlLoaded );
   }
}