【问题标题】:Access objects instantiated in Flex app's MXML file in other AS classes访问其他 AS 类中 Flex 应用程序的 MXML 文件中实例化的对象
【发布时间】:2011-07-29 14:09:13
【问题描述】:

我在我的 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 想法在这里不正确?

【问题讨论】:

    标签: apache-flex actionscript-3


    【解决方案1】:

    这取决于你的类架构。要使您的代码正常工作,必须在您的 SyncConnectorManager 中定义和实现 CDNClass 实例。

    通常,您可以随时调用组件,但永远不应该调用

    一种选择是将CDNClass 的实例传递给SyncConnectorManager 内的变量。将此变量添加到您的 SyncConnectionManager 类中:

    public var CDN:CDNClass = new CDNClass;
    

    在某些时候这样做:

    syncConnectorManagerInstance.CDN = CDN;
    

    这样,两个类都可以访问同一个 CDN 实例,并可以在其上调用方法。

    【讨论】:

    • 感谢您的回复。你的解决方案对我来说很有意义。这是那些希望使用它们的外部对象访问一个对象的公共方法/属性的典型方式吗?我正在尝试应用最佳 OOD/OOP 实践。再次感谢。
    • @CamdenX “典型方法”和“最佳实践”都可以解释。任何给定的最佳实践都有许多条件,即何时是一个好主意,什么时候不是。您可以在 CDNClass 上定义静态方法并在多个类中使用它。您还可以创建一个 Singleton 并在多个类中使用它而无需传递参数。有些人使用带有依赖注入的框架来传递 lass 实例。根据我们所知道的很少,很难说哪一个最适合您。
    【解决方案2】:

    是的,您的 OOP 思维在这里不正确。您应该记住类和实例之间的差异。这一行在当前类中声明了一个字段,并用一个实例来初始化它:

    public var CDN:CDNClass = new CDNClass;
    

    因此,您的 MXML class 的当前实例(您可以将其视为带有其他符号的通常 AS 类)具有公共字段。要使用 CDN 实例操作,您需要以下内容:

    • 从您的 MXML 的实例中读取CDN 的值(只要它是公开的)。为此,您需要对其进行一些参考。
    • 您的 MXML 的实例可以引用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 与其他人和团队成员讨论您的代码:)

    【讨论】:

    • 感谢您抽出宝贵时间回答我的问题。您的回复很有帮助。
    • 如果一个类需要摄取(和访问)一个在运行时实例化的对象,而该对象不能在类的构造函数中传递给它,该怎么办?那么最佳实践设计是什么,让类的公共函数将运行时实例化类分配给私有类变量?
    • 您至少有 3 个选项:公共字段 (public var myProp:MyClass)、setter (public function set myProp(value:MyClass):void) 和公共方法 (public function setMyProp(value:MyClass):void)。如果您需要对注入执行其他操作,则使用后两种方式。 Setter 选项允许您使用 MXML 属性来注入值。
    • 谢谢 - 非常有意义。
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多