我在Flex应用程序的单个MXML文件中声明并实例化了一个对象:
public var CDN:CDNClass = new CDNClass;
我想在另一个.as文件中声明的另一个类中访问同一个CDN对象(及其公共方法和属性):
package my.vp
{
import my.media.CDNClass;
public class SyncConnectorManager
{
private function syncMessageReceived(p_evt:SyncSwfEvent):void
{
switch (p_evt.data.msgNm)
{
case "startStream" :
// Play a stream
CDN.parsePlayList(p_evt.data.msgVal);
break;
但是当我尝试在.as文件中定义的类中的方法中访问CDN对象中的公共方法parsePlayList时,我收到以下错误:
访问未定义的属性CDN
我想要这样做的原因是将我的应用程序的逻辑分解为多个AS文件并且具有最少的MXML文件,可能只有一个。
谢谢 - 非常感谢任何帮助。也许我的OOD / OOP思想在这里不正确?
答案 0 :(得分:2)
IT取决于您的班级架构。要使代码生效,必须在CDNClass
内定义并实施SyncConnectorManager
实例。
通常,您可以随时调用组件,但不应该调用
一种选择是将CDNClass
的实例传递给SyncConnectorManager
内的变量。将此变量添加到SyncConnectionManager类:
public var CDN:CDNClass = new CDNClass;
在某些时候这样做:
syncConnectorManagerInstance.CDN = CDN;
这样两个类都可以访问同一个CDN实例,并且可以在其上调用方法。
答案 1 :(得分:1)
是的,你的OOP思想在这里不正确。您应该记住类和实例之间的差异。该行在当前类中声明了一个字段,并使用实例启动它:
public var CDN:CDNClass = new CDNClass;
因此,您的MXML 类的当前实例(您可以像往常一样考虑使用其他符号的AS类)具有公共字段。要使用CDN
实例进行操作,您需要以下内容:
CDN
(就公开而言)的值。你需要一些参考。SyncConnectorManager
的实例,而SyncConnectorManager
应该有一种方法可以在那里注入CDN
的值。类似的东西:你的班级:
package my.vp
{
import my.media.CDNClass;
public class SyncConnectorManager
{
private var CDN:CDNClass;
public function SyncConnectorManager(CDN:CDNClass)
{
this.CDN = CDN;
}
private function syncMessageReceived(p_evt:SyncSwfEvent):void
{
switch (p_evt.data.msgNm)
{
case "startStream" :
// Play a stream
CDN.parsePlayList(p_evt.data.msgVal);
break;
在你的情况下,SyncConnectorManager
类没有声明CDN
(你提到的编译器错误的问题)和实例化(即使你只声明了字段,NPE的问题)。
作为底线,我建议您按照ActionScript naming and coding conventions与其他人和团队成员讨论您的代码:)