Как получить доступ к свойствам и методам класса без расширения или создания экземпляров?
Допустим, у меня есть определенный ClassA. ClassB расширяет ClassA, и на сцене есть экземпляр Movie Clip, связанный с ClassB.
Как ClassC получит доступ к свойствам и методам ClassB, не расширяя ClassB или не создавая новый экземпляр ClassB?
В настоящее время я делаю это, ссылаясь на экземпляр stage, связанный с 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.
}
}
}
Поэтому я хочу знать, есть ли лучший способ получить значение classAvar (которое было объявлено в ClassA, получено после вызова метода в ClassB) во время работы в ClassC.
Решено:
Хорошо, после некоторого исследования и идеи, которую я получил от daniel.sedlacek, кажется, что я нашел решение, которое наилучшим образом соответствует моим потребностям.
в классе B:
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 ответа
A) Не делайте этого, подумайте о лучшей архитектуре, которая будет учитывать слабую связь инкапсуляции.
Б) Если вам нужно это сделать, вы можете использовать статический глобальный регистр и назначить ему все экземпляры сцены (например, ваш ClassB), например:
в классе B:
StaticRegister.assign(this);
в StaticRegister:
publis static var register : Array = [];
public static function assign(instance : Object) : void {
array.push(instance);
}
А затем вытащите его оттуда подобным образом. Но это действительно грязно делать это так.
C) Если есть только один экземпляр ClassB, вы можете предоставить ему статические - синглтоноподобные - аксессоры:
В классе B:
private static var instance : ClassB;
publis static function getInstance() : ClassB {
return instance;
}
В конструкторе:
public class ClassB() {
instance = this;
}
Подробнее о полных синглетонах: www.actionscript.org или Google или Wikipedia.
и это работает, только если доступные переменные являются общедоступными или внутренними, в зависимости от того, в какой пакет входит ClassC. Я хотел бы знать, есть ли лучший, более чистый способ достигнуть этого.
Это один из базовых принципов ООП. Вы не можете получить частные и защищенные свойства или методы. Если вы хотите получить их, вы должны сделать их публичными или внутренними.