Как получить доступ к свойствам и методам класса без расширения или создания экземпляров?

Допустим, у меня есть определенный 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. Я хотел бы знать, есть ли лучший, более чистый способ достигнуть этого.

Это один из базовых принципов ООП. Вы не можете получить частные и защищенные свойства или методы. Если вы хотите получить их, вы должны сделать их публичными или внутренними.

Другие вопросы по тегам