На статическую переменную можно легко ссылаться откуда угодно. Будь то суперкласс, обращающийся к одному из своих подклассов (или sub-sub -...- class), или совершенно другой класс, зависящий от рассматриваемой статической переменной, вы можете получить к нему доступ следующим образом:
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!
В этом маршруте есть одна проблема. Это заставит вас писать «плохой код». Суперкласс должен НЕ знать какие-либо бизнесы своего подкласса и что они должны делать при определенных условиях. Это правило, которое в значительной степени каждый шаблон проектирования программирования пытается поощрять (и по уважительным причинам), и нарушение этого правила может в долгосрочной перспективе потребовать больших затрат времени, энергии и усилий.
Ситуации, подобные этой, требуют класса " Controller ". По сути, класс, созданный из другого места, будет нести ответственность за анализ объекта A / B / C (например, аналогично тому, как это делает оператор переключения A.doSomething ()). Это освобождает ваши классы Super & Sub от беспорядка и оставляет гораздо больше места для расширения и твердого кода.
Надеюсь, это отвечает всем вашим потребностям в доступе к переменным! :)