如何在不扩展或实例化的情况下访问类的属性和方法?

时间:2012-01-09 15:12:14

标签: actionscript-3 class flash-cs5.5 flash-ide

假设我有一个已定义的ClassA。 ClassB扩展了ClassA,并且在链接到ClassB的舞台上有一个Movie Clip实例。

ClassC如何在不扩展ClassB或创建ClassB的新实例的情况下访问ClassB的属性和方法?

我目前正在这样做的方法是引用链接到ClassB的舞台实例,然后使用点语法访问ClassB实例变量,这只有在被访问的变量是公共或内部变量时才有效,具体取决于哪个包ClassC是其中的一部分。我想知道是否有更好,更清洁的方法来实现这一目标。

编辑:代码示例。

package com.core.stage.classes {

    import flash.display.MovieClip;

    public class ClassA extends MovieClip {

        public var classAvar:uint = 0;

        public function ClassA() {

        }

        protected function classAfunction(funPar:uint):void {
            classAvar = 2 * funPar;
        }

    }

}

package com.core.stage.classes {

    import com.core.stage.classes.ClassA;

    public class ClassB extends ClassA {

        public function ClassB() {
            classAfunction(10);
        }

    }

}

package com.core.stage.classes {

    import flash.display.MovieClip;

    public class ClassC extends MovieClip {

        private var classBreference:*;

        public function ClassC() {
            classBreference = Object(parent);
            trace(classBreference.classAvar); // Outputs 20.
        }

    }

}

所以我基本上想知道的是,在ClassC中工作时,是否有更好的方法来获取classAvar的值(在ClassA中声明,在ClassB中调用方法后得到一个值)。

解决:

好的,经过我从daniel.sedlacek得到的一些研究和想法后,似乎我找到了最适合我需要的解决方案。

ClassB中的

private static var _instance:ClassB;

public function ClassB() { // constructor
    _instance = this;
}


public static function get FUN_GetInstance():ClassB {
 return _instance; 
}
ClassC中的

private var MC_VariablesContainer:ClassB
MC_VariablesContainer:MC_ClassB = ClassB.FUN_GetInstance

2 个答案:

答案 0 :(得分:2)

  

这仅适用于所访问的变量是公共变量或内部变量,具体取决于ClassC所属的包。我想知道是否有更好,更清洁的方法来实现这一目标。

这是OOP的基本原则之一。您无法获得私有和受保护的属性或方法。如果你想获得它们,你应该公开或内部。

答案 1 :(得分:1)

A) 不要这样做,想想更好的架构会尊重封装松耦合。

B) 如果必须这样做,可以使用静态全局寄存器并将所有阶段实例(如ClassB)分配给它,例如:

ClassB中的

StaticRegister.assign(this);

在StaticRegister中:

publis static var register : Array = [];

public static function assign(instance : Object) : void {
   array.push(instance);
}

然后以类似的方式将它从那里拿出来。但这样做真是太脏了。

C) 如果只有一个ClassB实例,你可以给它静态 - 单例像 - 访问者:

在ClassB中:

private static var instance : ClassB;  

publis static function getInstance() : ClassB {
  return instance;
 }

在构造函数中:

public class ClassB() {
   instance = this;
}

有关完整单身人士的更多信息:www.actionscript.org或Google或维基百科。