假设我有一个已定义的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
答案 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或维基百科。