静态变量可以很容易地从任何地方引用。无论是访问其中一个子类(或子子类...)还是完全依赖于所讨论的静态变量的完全不同的类,都可以通过以下方式访问它:
现在
public function someFunction():void {
//Direct Access: Most typical way - accessing a public static var/const,
//your local-variable should match the data-type of the static
//variable you're accessing.
var localVar:String = ClassName.StaticVarName;
//Dynamic Access: An alternative that can be handy for verifying
//variables that exists, and then use them once confirmed:
if(ClassName["StaticVarName"]!=null) {
trace("Found value: " + ClassName["StaticVarName"]);
}
//Iterative Access: If you're looking to iterate through each static
//variables of a certain class, you can collect those by accessing its
//description XML document (E4X access that is).
var classDescription:XML = describeType(ClassName);
var classVarNames:XMLList = classDescription.variable.attribute("name");
for each(var classVarName:String in classVarNames) {
trace("Found class var: " + classVarName);
}
}
,才能访问你的类层次结构埋了几级下降实例变量,你可以尝试这样的事:
// File: A.as
package {
public class A {
public function A() {
}
public function doSomething():void {
switch(Object(this).constructor) {
case B: trace(B(this).methodOnlyInB()); break;
case C: trace(C(this).variableOnlyInC); break;
default: trace("You are simply in 'A'!"); break;
}
}
}
}
// File: B.as
package {
public class B extends A {
public function B() {
super();
}
public function methodOnlyInB():String {
return "You are calling a 'B' method!";
}
}
}
// File: C.as
package {
public class C extends B {
public var variableOnlyInC:String = "You are tracing a 'C' variable";
public function C() {
super();
}
}
}
// File: TestABC.as
var a:A = new A();
var b:B = new B();
var c:C = new C();
a.doSomething(); //Should trace: You are simply in 'A'!
b.doSomething(); //Should trace: You are calling a 'B' method!
c.doSomething(); //Should trace: You are tracing a 'C' variable!
有“问题”下得去这条路线的一个位。这会让你写“糟糕的代码”。一个超级应该不是知道它的任何子类业务,他们应该在某些条件下应该做什么。它的一条规则是,几乎所有的编程设计模式都试图鼓励(并且出于很好的理由),并且违反这个规则可能会花费大量的时间,精力和拉长头发。
像这样的情况需要“控制器”类。基本上,从其他地方实例化的类将有责任分析A/B/C对象(例如:与A.doSomething()的switch语句如何执行此操作类似)。这样可以让你的子类从混乱中解脱出来,并为扩展和实体代码留下更多空间。
希望能回答您所有的变量访问需求! :)
感谢您的回答马蒂,从C调用公共变量不是静态的呢?这可能吗?我拥有的是从B发出的事件,让我知道C发生了变化,但是我需要在事件发送时从A中检索C中的变量。我希望你能理解我刚写的东西。 – 2011-05-01 11:00:26
@蒂姆乔伊斯你还想在你的评论中回答这个问题吗? – Taurayi 2011-05-01 12:14:24